剑指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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。