分析與解法
前序: a b c d e f
後序: d b a e c f
“a”是前序走訪節點的第一個元素,它把中序遍曆的結果分為“db”和“ecf”兩個部分,這兩部分也是“a”的左右子樹的遍曆結果。
如果能夠找到前序走訪中對應的左子樹和右子樹,就可以把“a”作為當前的根節點,然後依次遞迴下去,這樣就能夠依次恢複左子樹和右子樹的遍曆結果。
using System;using System.Collections.Generic;using System.Text;namespace ConsoleApp{ class Program { static void Main(string[] args) { TreeNode node1 = new TreeNode(); node1.Data = 1; TreeNode node2 = new TreeNode(); node2.Data = 2; TreeNode node3 = new TreeNode(); node3.Data = 3; TreeNode node4 = new TreeNode(); node4.Data = 4; TreeNode node5 = new TreeNode(); node5.Data = 5; TreeNode node6 = new TreeNode(); node6.Data = 6; TreeNode node7 = new TreeNode(); node7.Data = 7; TreeNode node8 = new TreeNode(); node8.Data = 8; TreeNode node9 = new TreeNode(); node9.Data = 9; TreeNode[] nodes1 ={ node1, node2, node4, node7, node3, node5, node8, node6, node9 }; TreeNode[] nodes2 ={ node7, node4, node2, node1, node8, node5, node3, node6, node9 }; TreeNode root = ReBuild.ReBuildTree(nodes1, nodes2, 0, 0, nodes1.Length); Tree tree2 = new Tree(); tree2.Root = root; Tree.Print2(tree2); Console.ReadKey(); } } class Tree { public TreeNode Root; /// /// 廣度優先遍曆二叉樹 /// public static void Print2(Tree tree) { if (tree.Root == null) { return; } else { Queue> queue = new Queue>(); queue.Enqueue(tree.Root); while (queue.Count != 0) { int currentLevelCount = queue.Count; for (int i = 0; i < currentLevelCount; i++) { TreeNode node = queue.Dequeue(); if (node.Data != null) { Console.Write(node.Data); } if (node.LeftSon != null) { queue.Enqueue(node.LeftSon); } if (node.RightSon != null) { queue.Enqueue(node.RightSon); } } Console.WriteLine(); } } } } class TreeNode { public T Data; public TreeNode LeftSon; public TreeNode RightSon; } class ReBuild { public static TreeNode ReBuildTree(TreeNode[] preOrder, TreeNode[] inOrder, int preIndex, int inIndex, int length) { if (preOrder == null || length == 0) { return null; } else if (preOrder.Length != inOrder.Length) { return null; } else if (length == 1) { return preOrder[preIndex]; } for (int i = inIndex; i < inIndex + length; i++) { if (preOrder[preIndex] == inOrder[i]) { preOrder[preIndex].LeftSon = ReBuildTree(preOrder, inOrder, preIndex + 1, inIndex, i - inIndex); preOrder[preIndex].RightSon = ReBuildTree(preOrder, inOrder, preIndex + i - inIndex + 1, i + 1, length - i + inIndex - 1); } } return preOrder[preIndex]; } }}