剑指offer-test23

    xiaoxiao2022-07-02  105

    23.二叉搜索树的后序遍历序列 题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 算法步骤如下:

    找到根结点root;–序列数组的最后一个元素一定是根节点

    遍历序列(除去root结点),找到第一个大于等于根结点root的元素i,则i左侧为左子树、i右侧为右子树;

    我们已经知道i左侧所有元素均小于根结点,那么再依次遍历右侧,看是否所有元素均大于根结点;若出现小于根结点的元素,则直接返回false;若右侧全都大于根结点,则:

    分别递归判断左/右子序列是否为后序序列

    public class Solution { public boolean VerifySquenceOfBST(int [] seq) { if(seq.length==0)return false; if(seq.length==1)return true; return search(seq,0,seq.length-1); } //left<root<right public boolean search(int[] a,int start,int root){ //遍历完数组的一部分,没报错,返回true if(start>=root) return true; //i从第一个开始找,一直找到第一个比当前根节点数大的数。 //那么记录下这个位置,从这个位置开始将字符分为前后两部分。 int i=start; while(a[i]<a[root]){ i++; } //继续从记录的位置来寻找。只要出现了比当前根节点数小的数 //那么说明该数组不满足right>root这个特性。返回false。 for(int j=i;j<root;j++){ if(a[j]<a[root]){ return false; } } //如果从记录的位置一直都没有出现小于当前根节点的数那么 //在进一步判断该根节点的左右序列是否满足。 return search(a,start,i-1)&&search(a,i,root-1); } }

    后序遍历特点:左右根 二叉搜索树又称二叉查找树,二叉排序树。它要么是一颗空树,要么就是具有如下性质的二叉树: (1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2) 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3) 任意节点的左、右子树也分别为二叉查找树; (4) 没有键值相等的节点。

    算法思路: 对于后序遍历来说,序列数组的最后一个元素一定是根节点, -则根据这个元素,将前面的数组分为左、右两个部分,左侧部分都小,右侧部分都大, - 如果右侧部分有比该根节点小的元素,那么就不是后序遍历,如此递归进行.

    满二叉树:从高到低,除了叶结点外,所有结点的左右结点都存在。 完全二叉树:比满二叉树少几个叶结点,从左向右放子结点。 平衡二叉树:空树或者它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树也都是平衡树。 二叉搜索树:空树或者二叉树的所有结点比它的左子结点大,比它的右子结点小。 扩展: 1.二叉搜索树的前序遍历序列 这其实和上面的二叉搜索树的后序遍历规律是一样的,不过后序遍历根结点在后面,前序遍历根结点在前面而已,即第一个就是根结点的值。 2.二叉搜索树的中序遍历序列

    最新回复(0)