• 【Java】 剑指offer(33) 二叉搜索树的后序遍历序列


    本文参考自《剑指offer》一书,代码采用Java语言。

    更多:《剑指Offer》Java实现合集  

    题目 

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

    思路

      二叉树后序遍历数组的最后一个数为根结点,剩余数字中,小于根结点的数字(即左子树部分)都排在前面,大于根结点的数字(即右子树部分)都排在后面。根据遍历数组的这个特性,可以编写出一个递归函数,用于实现题目所要求的判断功能。

    测试算例 

      1.功能测试(左斜树;右斜树;能对应的二叉树;不能对应的二叉树序列)

      2.特殊测试(null;一个结点)

    Java代码

    //题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
    //如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
    
    public class SquenceOfBST {
    	public boolean  verifySquenceOfBST(int[] sequence) {
    		if(sequence== null || sequence.length<=0)
    			return false;
    		return verifyCore(sequence, 0, sequence.length-1);
    	}
    		
    	private boolean verifyCore(int[] sequence,int start,int end) {
    		if(start>=end) 
    			return true;
    		//判断左子树
    		int mid=start;
    		while(sequence[mid]<sequence[end]) 
    			mid++;
    		//判断右子树
    		for(int i=mid;i<end;i++) {
    			if(sequence[i]<sequence[end])
    				return false;
    		}
    		return verifyCore(sequence, start, mid-1)&&verifyCore(sequence, mid, end-1);
    	}	
    }
    

      

    收获

      1.寻找出序列规律,就能较快得到思路。此题如果改为BST的前序遍历也是相同的思路。

      2.对于要求处理二叉树序列的问题:找到根结点后,拆分出左右子树,对左右子树可以进行递归处理。

      3.虽然有了思路,但自己在编写代码的时候还是写得比较乱,花了一些时间才能修改出比较简洁和清晰易懂的版本,说明自己写的代码量还是不够,要继续多加练习。

    更多:《剑指Offer》Java实现合集  

      

  • 相关阅读:
    507.Perfect Number
    441.Arranging Coins
    344.Reverse String
    160.Intersection of Two Linked Lists
    HDU-2521 反素数
    HDU-2710 Max Factor
    HDU-2552 三足鼎立
    HDU-2549 壮志难酬
    HDU-2548 两军交锋
    HDU-2550 百步穿杨
  • 原文地址:https://www.cnblogs.com/yongh/p/9819233.html
Copyright © 2020-2023  润新知