rt,
分析与解法
前序: a b c d e f
后序: d b a e c f
“a”是前序遍历节点的第一个元素,它把中序遍历的结果分为“db”和“ecf”两个部分,这两部分也是“a”的左右子树的遍历结果。
如果能够找到前序遍历中对应的左子树和右子树,就可以把“a”作为当前的根节点,然后依次递归下去,这样就能够依次恢复左子树和右子树的遍历结果。
C# Codes
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
TreeNode<int> node1 = new TreeNode<int>();
node1.Data = 1;
TreeNode<int> node2 = new TreeNode<int>();
node2.Data = 2;
TreeNode<int> node3 = new TreeNode<int>();
node3.Data = 3;
TreeNode<int> node4 = new TreeNode<int>();
node4.Data = 4;
TreeNode<int> node5 = new TreeNode<int>();
node5.Data = 5;
TreeNode<int> node6 = new TreeNode<int>();
node6.Data = 6;
TreeNode<int> node7 = new TreeNode<int>();
node7.Data = 7;
TreeNode<int> node8 = new TreeNode<int>();
node8.Data = 8;
TreeNode<int> node9 = new TreeNode<int>();
node9.Data = 9;
TreeNode<int>[] nodes1 ={ node1, node2, node4, node7, node3, node5, node8, node6, node9 };
TreeNode<int>[] nodes2 ={ node7, node4, node2, node1, node8, node5, node3, node6, node9 };
TreeNode<int> root = ReBuild<int>.ReBuildTree(nodes1, nodes2, 0, 0, nodes1.Length);
Tree<int> tree2 = new Tree<int>();
tree2.Root = root;
Tree<int>.Print2(tree2);
Console.ReadKey();
}
}
class Tree<T>
{
public TreeNode<T> Root;
/// <summary>
/// 广度优先遍历二叉树
/// </summary>
public static void Print2(Tree<T> tree)
{
if (tree.Root == null)
{
return;
}
else
{
Queue<TreeNode<T>> queue = new Queue<TreeNode<T>>();
queue.Enqueue(tree.Root);
while (queue.Count != 0)
{
int currentLevelCount = queue.Count;
for (int i = 0; i < currentLevelCount; i++)
{
TreeNode<T> 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<T>
{
public T Data;
public TreeNode<T> LeftSon;
public TreeNode<T> RightSon;
}
class ReBuild<T>
{
public static TreeNode<T> ReBuildTree(TreeNode<T>[] preOrder, TreeNode<T>[] 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];
}
}
}