剑指offer——二叉树的后续遍历

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

解题思路:

1. 后序遍历序列的最后一个元素为二叉树的根节点;
2. 二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根结点。

算法步骤如下:
1. 找到根结点;
2. 遍历序列,找到第一个大于等于根结点的元素i,则i左侧为左子树、i右侧为右子树;
3. 我们已经知道i左侧所有元素均小于根结点,那么再依次遍历右侧,看是否所有元素均大于根结点;若出现小于根结点的元素,则直接返回false;若右侧全都大于根结点,则:
4. 分别递归判断左/右子序列是否为后序序列;
 
 1 public class Solution {
 2     public boolean VerifySquenceOfBST(int [] sequence) {
 3         int length = sequence.length;
 4         if(length==0||sequence==null)
 5             return false;
 6         
 7         return have(sequence,0,length-1);
 8     }
 9     
10     public static boolean have(int [] sequence,int start,int end)
11     {
12         if(start>end)
13             return true;//如果遍历完数组没报错,返回true
14         int i=start;
15         for(;i<end;i++)
16         {
17             if(sequence[i]>sequence[end])
18                 break;
19         }
20         
21         int j=i;
22         for(;j<end;j++)
23         {
24             if(sequence[j]<sequence[end])
25                 return false;
26         }
27         
28         boolean left = true;
29         
30         if(i>0)
31         {
32             left = have(sequence,start,i-1);
33         }
34         boolean right = true;
35         
36         if(i<end-1)
37         {
38             right = have(sequence,i,end-1);
39         }
40         
41         return (left&&right);
42     }
43 }
 

猜你喜欢

转载自www.cnblogs.com/wangyufeiaichiyu/p/10861123.html