您的位置:首页 > 职场人生

剑指Offer面试题:5.重建二叉树

2015-08-19 23:12 701 查看

一、题目:重建二叉树

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示的二叉树并输出它的头结点。 

// 单元测试主入口
public static void ConstructTestPortal(string testName, int[] preOrder, int[] inOrder, int length)
{
if (!string.IsNullOrEmpty(testName))
{
Console.WriteLine("{0} begins:", testName);
}
// 打印先序遍历
Console.Write("The preorder sequence is : ");
for (int i = 0; i < length; i++)
{
Console.Write(preOrder[i]);
}
Console.Write("\n");
// 打印中序遍历
Console.Write("The inorder sequence is : ");
for (int i = 0; i < length; i++)
{
Console.Write(inOrder[i]);
}
Console.Write("\n");

try
{
Node<int> root = Construct(preOrder, inOrder, length);
BinaryTree<int> bTree = new BinaryTree<int>();
bTree.Root = root;
Console.Write("The binary tree is : ");
// 重建的二叉树层次遍历
bTree.LevelOrder(bTree.Root);
if (!string.IsNullOrEmpty(testName))
{
Console.Write("\n{0} end\n\n", testName);
}
}
catch (Exception)
{
Console.WriteLine("Invalid input!");
}
}


View Code
  该方法首先接收参数,依次打印先序遍历和中序遍历,最后通过调用Construct方法获得重建的二叉树的根节点,并实例化一个二叉树的数据结构(本处的二叉树结构的实现请阅读《数据结构基础温故-4.树与二叉树(上)》),最后输出重建后的二叉树的层次遍历验证是否重建成功。

  (1)普通二叉树

// 普通二叉树
//              1
//           /     \
//          2       3
//         /       / \
//        4       5   6
//         \         /
//          7       8
public static void ConstructTest1()
{
int[] preorder = { 1, 2, 4, 7, 3, 5, 6, 8 };
int[] inorder = { 4, 7, 2, 1, 5, 3, 8, 6 };

ConstructTestPortal("ConstructTest1", preorder, inorder, 8);
}


  (2)所有结点都没有右子结点

// 所有结点都没有右子结点
//            1
//           /
//          2
//         /
//        3
//       /
//      4
//     /
//    5
public static void ConstructTest2()
{
int[] preorder = { 1, 2, 3, 4, 5 };
int[] inorder = { 5, 4, 3, 2, 1 };

ConstructTestPortal("ConstructTest2", preorder, inorder, 5);
}


  (3)所有结点都没有左子结点

// 所有结点都没有左子结点
//            1
//             \
//              2
//               \
//                3
//                 \
//                  4
//                   \
//                    5
public static void ConstructTest3()
{
int[] preorder = {1, 2, 3, 4, 5};
int[] inorder = {1, 2, 3, 4, 5};

ConstructTestPortal("ConstructTest3", preorder, inorder, 5);
}


  (4)树中只有一个结点

// 树中只有一个结点
public static void ConstructTest4()
{
int[] preorder = { 1 };
int[] inorder = { 1 };

ConstructTestPortal("ConstructTest4", preorder, inorder, 1);
}


  (5)完全二叉树

// 完全二叉树
//              1
//           /     \
//          2       3
//         / \     / \
//        4   5   6   7
public static void ConstructTest5()
{
int[] preorder = {1, 2, 4, 5, 3, 6, 7};
int[] inorder = {4, 2, 5, 1, 6, 3, 7};

ConstructTestPortal("ConstructTest5", preorder, inorder, 7);
}


  (6)输入空指针

// 输入空指针
public static void ConstructTest6()
{
ConstructTestPortal("ConstructTest6", null, null, 0);
}


  (7)输入的两个序列不匹配

// 输入的两个序列不匹配
public static void ConstructTest7()
{
int[] preorder = {1, 2, 4, 5, 3, 6, 7};
int[] inorder = {4, 2, 8, 1, 6, 3, 7};

ConstructTestPortal("ConstructTest7", preorder, inorder, 7);
}


  单元测试的结果如下图所示:



作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: