C/Golang 剑指offer-24-二叉搜索树的后序遍历序列 详解

题目

地址:https://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd

在这里插入图片描述

思路

  • 根节点的值大于左子树小于右子树
  • 后序遍历: 左子树 -> 右子树 -> 根节点

关键:最后一个元素是根节点,找到他的左子树和右子树,递归判断。

在这里插入图片描述

Golang 代码

package main

import "fmt"

func main() {
	fmt.Printf("VerifySquenceOfBST([]int{5, 7, 6, 9, 11, 10, 8})=%#v\n", VerifySquenceOfBST([]int{5, 7, 6, 9, 11, 10, 8}))
	fmt.Printf("VerifySquenceOfBST([]int{7,4,5,6})=%#v\n", VerifySquenceOfBST([]int{7, 4, 5, 6}))
}

func VerifySquenceOfBST(sequence []int) bool {
	if sequence == nil || len(sequence) <= 0 {
		return false
	}
	length := len(sequence)
	root := sequence[length-1]
	//get left tree
	l := 0
	for ; l < length-1; l++ {
		if root < sequence[l] {
			break
		}
	}
	//verify right tree.
	r := l
	for ; r < length-1; r++ {
		if root > sequence[r] {
			return false
		}
	}
	left := true
	if l > 0 {
		left = VerifySquenceOfBST(sequence[:l])
	}
	right := true
	if r < length-1 {
		right = VerifySquenceOfBST(sequence[l:length])
	}
	return left && right
}

C 代码

#include <stdio.h>
#define bool int
#define true 1
#define  false 0
//reference:https://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd
bool verify_post_BST(int seq[], int len) {
    if (seq == NULL || len <= 0) {
        return false;
    }
    int root = seq[len - 1];
    //get left tree
    int l = 0;
    for (; l < len - 1; l++) {
        if (root < seq[l]) {
            break;
        }
    }
    //get right tree.
    int r = l;
    for (; r < len - 1; r++) {
        if (root > seq[r]) {
            return false;
        }
    }
    bool left = true;
    if (l > 0) {
        left = verify_post_BST(seq, l);
    }
    bool right = true;
    if (r < len - 1) {
        right = verify_post_BST(seq + l, len - l - 1);
    }
    return left && right;
}
int main() {
    int seq1[] = {5, 7, 6, 9, 11, 10, 8};
    bool r1 = verify_post_BST(seq1, 7);
    int seq2[] = {7,4,5,6};
    bool r2 = verify_post_BST(seq2, 4);
    printf("r1=%d\n", r1);
    printf("r2=%d\n", r2);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JarvanStack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值