23_____二叉搜索树的后序遍历

知识摘要

1.二叉搜索树(又叫:二叉排序树,二叉查找树):

遵循: Tree.left.val<Tree.val<Tree.right.val.    所以它的中序遍历一定是一个有序列。

2.其他一些树:

满二叉树:从上往下,除了叶子结点外,其他结点的左右子节点都存在。

完全二叉树:比满二叉树少几个叶子结点,叶子结点从左向右依次放置。

平衡二叉树:它的左右子树高度差的绝对值不大于1,且它的左右子树也是平衡二叉树。

 

题目描述:

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

思路:

 

 

{5, 7, 6, 9, 11, 10, 8}就是以上搜索二叉树的后序遍历结果。 通过观察可以发现:数组中最后一个元素【8】就是该搜索二叉树的根结点,根结点之前的元素,若小于根结点就是左子树,若大于根结点就是右子树。然后继续采用递归进行计算。

public class Solution {
    
    public boolean VerifySquenceOfBST(int [] sequence) {
        
        if(sequence.length==0){
            return false;
        }
        return doMethod(sequence,0,sequence.length-1);
    }
    
    public  boolean doMethod(int[]sequence,int start,int end){
        
        if(start>=end){    //递归结束的条件   
            return true;   //结果为true
        }
        
        //左子树的所有元素都比根结点小   此时根节点是sequence[end]
        int i=0;     //记录左子树的位置
        for(;i<end;i++){
            if(sequence[i]>sequence[end]){
                break;
            }
        }
        
        //左子树结束  看右子树
        for(int j=i;j<end;j++){
            if(sequence[j]<sequence[end]){
                return false;
            }
        }
        
        boolean left=doMethod(sequence,start,i-1);
        boolean right=doMethod(sequence,i,end-1);   //根节点往后移
        return left&&right;
    }
    
}

总结:二叉树的问题,一般先找根节点 在找到左右子树的分隔点,然后采用递归的方法进行处理。

 

posted @ 2019-09-05 22:49  德鲁大叔817  阅读(380)  评论(0)    收藏  举报