题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列PreOrder={1,2,4,7,3,5,6,8}和中序遍历序列InOrder={4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路:
首先按PreOrder的顺序遍历各节点,在访问过程中,通过查找InOrder中的相应元素的顺序,来重建以当前节点为根的左子树和右子树。
例如,PreOrder[0]=1,则在InOrder中查找元素 1 的位置,在InOrder中,位于元素 1 左边的所有元素构成左子树,位于元素 1 右边的所有元素构成右子树。通过遍历PreOrder来重建整棵树。
相应代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _005_树的重建
{
public class TreeNode
{
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int x)
{
val = x;
}
}
class Solution
{
static public TreeNode reConstructBinaryTree(int[] pre, int[] tin)
{
return reBuild(pre, 0, pre.Length - 1, tin, 0, tin.Length - 1);
}
static public TreeNode reBuild(int[] pre, int startPre, int endPre, int[] tin, int startTin, int endTin)
{
if (startPre > endPre | startTin > endTin)
return null;
TreeNode root = new TreeNode(pre[startPre]);
for (int i = startTin; i <= endTin; i++)
{
if (pre[startPre] == tin[i])
{
root.left = reBuild(pre, startPre + 1, i - startTin + startPre, tin, startTin, i - 1);
root.right = reBuild(pre, i - startTin + startPre + 1, endPre, tin, i + 1, endTin);
}
}
return root;
}
static void Main()
{
int[] preOrder = new int[] { 1, 2, 4, 7, 3, 5, 6, 8 };
int[] inOrder = new int[] { 4, 2, 7, 1, 5, 3, 8, 6 };
Console.WriteLine("树的后序遍历PostOrder为:");
TreeNode root=reConstructBinaryTree(preOrder, inOrder);
PostOutPut(root);
Console.ReadKey();
}
//后序遍历输出
static void PostOutPut(TreeNode root)
{
if (root == null)
return;
PostOutPut(root.left);
PostOutPut(root.right);
Console.Write(root.val+" ");
}
}
}