zoukankan      html  css  js  c++  java
  • 二叉搜索树的后序遍历序列-剑指Offer

    二叉搜索树的后序遍历序列

    题目描述

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

    思路

    1. 后序遍历:左-->右-->根节点
    2. 二叉搜索树中,左子树的节点小于根节点,右子树的节点大于根节点
    3. 递归调用,根据大小区别左右子树,若在右子树中发现小于根节点的节点,就不是后续遍历序列
    4. 举一反三:如果要求处理一棵二叉树的遍历序列,我们可以先找到二叉树的根节点,再基于根节点把整棵树的遍历序列拆分成左子树对应的子序列和右子树对应的子序列,接下来再递归的处理这两个子序列

    代码

    public class Solution {
        public boolean VerifySquenceOfBST(int [] sequence) {
            if (sequence == null || sequence.length == 0) {
            	return false;
            }
            return verify(sequence, 0, sequence.length - 1);
            
        }
    	public boolean verify(int[] data, int start, int end) {
    		if (data == null || data.length == 0) {
    			return false;
    		}
        // 二叉搜索树中左子树的结点小于根结点
    		int i = start;
    		for (; i < end; i++) {
    			if (data[i] > data[end]) {
    				break;
    			}
    		}
        // 二叉搜索树中右子树的结点大于根结点
    		int j = i;
    		for (; j < end; j++) {
    			if (data[j] < data[end]) {
    				return false;
    			}
    		}
        // 判断左子树是不是二叉搜索树
    		boolean left = true;
    		if (i - start > 0) {
    			left = verify(data, start, i - 1);
    		}
        // 判断右子树是不是二叉搜索树
    		boolean right = true;
    		if (i < end) {
    			right = verify(data, i, end - 1);
    			
    		}
    		return (left && right);
    	}
    }
  • 相关阅读:
    临时表的问题
    List集合和Set集合互转
    mysql数据库事件
    mysql存储过程事务
    N皇后问题
    递归实现字符数组的全排列及组合
    判断一个序列是否为某二叉搜索树的后续遍历结果
    递归实现两个有序链表的合并
    递归实现字符串反转
    根据字节数截取字符串
  • 原文地址:https://www.cnblogs.com/rosending/p/5625035.html
Copyright © 2011-2022 走看看