前序遍历和中序遍历,并且根据前序和中序遍历,生成后序遍历
class 题号75//遍历树
{
static void Main()
{
PostorderTraversal(1);
Console.ReadKey();
int[] pre = { 1, 2, 4, 8, 9, 5, 10, 3, 6, 7 };
int[] mid = { 8, 4, 9, 2, 10, 5, 1, 6, 3, 7 };
reConstructBinaryTree(pre, mid);
}
public static int[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
#region
//前序遍历
public static void PreorderTraversal(int number)
{
// int number = 1;
//当下标越界或者当前元素为'^'时此次递归分支终止
if (number > data.Length || data[number - 1].Equals('^'))
{
return;
}
//Console.Write(data[number - 1] + " ");
int leftChildNum = number * 2;
PreorderTraversal(leftChildNum);
int rightChildNum = number * 2 + 1;
PreorderTraversal(rightChildNum);
}
#endregion
#region
//中序遍历
public static void MiddleTraversal(int number)
{
//当下标越界或者当前元素为'^'时此次递归分支终止
if (number > data.Length || data[number - 1].Equals('^'))
{
return;
}
int leftChildNum = number * 2;
MiddleTraversal(leftChildNum);
Console.Write(data[number - 1] + " ");
int rightChildNum = number * 2 + 1;
MiddleTraversal(rightChildNum);
}
#endregion
#region
//后续遍历
public static void PostorderTraversal(int number)
{
//当下标越界或者当前元素为'^'时此次递归分支终止
if (number > data.Length || data[number - 1].Equals('^'))
{
return;
}
int leftChildNum = number * 2;
PostorderTraversal(leftChildNum);
int rightChildNum = number * 2 + 1;
PostorderTraversal(rightChildNum);
Console.Write(data[number - 1] + " ");
}
#endregion
#region
//由前序遍历和中序遍历生成倒叙遍历
public class TreeNode
{
public int val; //当前节点的值
public TreeNode left;
public TreeNode right;
public TreeNode(int x)
{
val = x;
}
}
public static void reConstructBinaryTree(int[] pre, int[] mid)
{
TreeNode newTree= getRootTreeNode(pre, 0, pre.Length - 1, mid, 0, mid.Length - 1);
Console.ReadKey();
}
public static TreeNode getRootTreeNode(int[] pre, int preL,int preR, int[] mid, int inL, int inR)
{
if (preL > preR)
{
return null;
}
TreeNode node = new TreeNode(pre[preL]);
for (int i = inL; i <= inR; ++i)
{
if (mid[i] == pre[preL])
{
node.left = getRootTreeNode(pre, preL + 1, preL + i - inL, mid, inL, i - 1);
node.right = getRootTreeNode(pre, preL + i - inL + 1, preR, mid, i + 1, inR) ;
break;
}
}
Console.WriteLine(node.val);
return node;
}
#endregion
}