三个问题都是递归问题
1 重建二叉树:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
已知二叉树的中序和先序或者中序和后序,可以还原该二叉树,本例已知先序和中序,先序的第一个元素未二叉树的根节点,找到根节点在中序中的位置,则中序序列中,很节点左边的为左子树,右边为右子树,在先序中找到对应的左右子树的先序遍历,则对左右子树的先序和中序可依次确定左右子树的根节点,递归即可,代码如下:
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
return root;
}
public TreeNode reConstructBinaryTree(int[] pre,int startPre,int endPre,int[] in,int startIn,int endIn){
if(startPre>endPre||startIn>endIn){
return null;
}
TreeNode root=new TreeNode(pre[startPre]);
for(int i=startIn;i<=endIn;i++){
if(in[i]==pre[startPre]){
root.left=reConstructBinaryTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
root.right=reConstructBinaryTree(pre,startPre+i-startIn+1,endPre,in,i+1,endPre);
}
}
return root;
}
}
2 二叉树的镜像
操作给定的二叉树,将其变换为源二叉树的镜像。
思路:同样利用递归解决问题,首先将根节点的左右子树镜像,递归左右子树
public class Solution {
public void Mirror(TreeNode root) {
if(root!=null)
{
TreeNode left=root.right;
TreeNode right=root.left;
root.left=left;
root.right=right;
if(root.left!=null)//刚开始写错了是把这个if写成while了
Mirror(root.left);
if(root.right!=null)//开始时这个也写成while了
Mirror(root.right);
}
}
}
3输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
首先要了解二叉搜索树的特点,其任意一个节点的左子树小于根节点值,右子树值大于根节点值,后序遍历时,最后一个节点为根节点,去掉根节点以后,后序数组分为两部分,前一部分为左子树,其值小于根节点,后一部分为右子树,其值大于根节点,且这两段都应满足同样的条件。
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length==0)
return false;
if(sequence.length==1)
return true;
return IsPostOrder(sequence,0,sequence.length-1);
}
public boolean IsPostOrder(int[] sequence,int begin,int end){
if(begin>=end)
return true;
int t=sequence[end];
int i;
for(i=begin;i<end;i++){
if(sequence[i]>=t)
break;
}
int mid=i;
while(i<end){
if(sequence[i]<t)
return false;//如果后一段中出现了小于根节点值的节点,则不是合法的后序序列,否则要依次遍历剩余子序列
i++;
}
return IsPostOrder(sequence,begin,mid-1)&&IsPostOrder(sequence,mid,end-1);//一定要记得更新end坐标
}
}