二叉树的后序遍历(Java)

给定一个整数数组,检查该数组是否为某二叉搜索树的后序遍历结果。后序遍历的最后一个元素是树的根节点,前半部分是左子树,后半部分是右子树。通过递归方法分析左右子树,判断其合法性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

二叉搜索树:左子树的所有结点小于根结点 && 右子树的所有结点大于根节点;

二叉搜搜索树的后序遍历:遍历的最后一个元素是树的根节点;

基于以上两点,遍历的数组可以分为两部分,前半部分是左子树的值,后半部分是右子树的值,需要用递归的方法(即:左子树部分的数组最后一个元素是左子树的根节点)对树的左子树和右子树部分进行同样的操作;

 

实例:

     

 

如:后序遍历的数组 {5,7,6,9,11,10,8}  ,8为树的根节点 ,数组前半部分{5,7,6}为左子树部分,后半部分{9,11,10} 为右子树部分;对于数组{5,7,6} ,最后一个元素 6 为左子树的根节点,{5} 为子子树结点,{7}为右子树结点;数组{9,11,10}一样的道理。。。得到数组 {5,7,6,9,11,10,8} 为数的后续遍历。。

如:数组{7,4,6,5}  即 最后一个元素 5为树的根节点,因为第一个元素 7>5,所以7为二叉树的右子树结点,表示该树没有左子树,数组的所有元素都是右子树结点;但是第二个元素 4<5 不符合二叉树的所有右子树结点都大于根节点的条件,所以不存在这样的二叉树后续的遍历结果。。

扩展:输入数组判读是否为前序遍历(数组的第一个元素为树的根节点)。。

具体代码:

package com.test.my编程;

public class Test24 {

	public boolean VerifySquenceOfBST(int []array)
	{
		
		if(array==null || array.length<=0)
		{
			return false;
		}
		
		return tree(array, 0, array.length-1);
	}
	
	public boolean tree(int []array ,int start,int end)
	{
		if(start>=end) return true;
		
		//后序遍历的最后一个元素是树的根节点
		int root=array[end];
		
		
		int i=start;
		//二叉树的左子树结点都小于根节点
		while(array[i]<root)
		{
			 i++; 
		}
		 
		
		 int j=i;
                //二叉树的右子树结点都大于根节点
		while(j<end)
		{
			if(array[j]<root)
			 {
				 return false;
			 }
			j++;
		}
		
		//递归判左子树是不是二叉树搜索树
		boolean left=tree(array, start, i-1);
		
		//递归判右子树是不是二叉树搜索树
		boolean right=tree(array, i, end-1);
			
		return left && right;
		
	}

}

 

r

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值