二叉树后序遍历数组 -- 漫漫算法路 刷题篇

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

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        int len = sequence.length,j=0,k=0;
        if(len ==0){
            return false;
        }
        for(int i=0;i<=len-1;i++){
            while(sequence[k]<sequence[len-1-i]){k++;j++;}
            while(sequence[k]>sequence[len-1-i]){k++;j++;}
            if(j<len-1)return false;
            k=0;
        }
        return true;
    }
}

这里写图片描述

以下是使用C语言根据后序遍历和中序遍历创建二叉树的代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; TreeNode* buildTree(int* inorder, int inStart, int inEnd, int* postorder, int postStart, int postEnd) { if (inStart > inEnd || postStart > postEnd) { return NULL; } int rootVal = postorder[postEnd]; int rootIndex = -1; for (int i = inStart; i <= inEnd; i++) { if (inorder[i] == rootVal) { rootIndex = i; break; } } TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = rootVal; root->left = buildTree(inorder, inStart, rootIndex - 1, postorder, postStart, postStart + rootIndex - inStart - 1); root->right = buildTree(inorder, rootIndex + 1, inEnd, postorder, postStart + rootIndex - inStart, postEnd - 1); return root; } int main() { int in[] = { 4, 2, 5, 1, 6, 3 }; int post[] = { 4, 5, 2, 6, 3, 1 }; int n = sizeof(in) / sizeof(in[0]); TreeNode* root = buildTree(in, 0, n - 1, post, 0, n - 1); return 0; } ``` 代码中的 `buildTree` 函数接收中序遍历数组 `in`、后序遍历数组 `post` 的起始和结束下标,返回根节点。函数首先判断边界条件,当 `inStart > inEnd` 或 `postStart > postEnd` 时,返回 NULL。接着,在后序遍历数组中找到当前子树的根节点值 `rootVal`,并在中序遍历数组中找到 `rootVal` 对应的下标 `rootIndex`。根据 `rootIndex`,可以将中序遍历数组分成左子树和右子树两部分。同时,由于后序遍历的顺序是左子树、右子树、根节点,所以在后序遍历数组中也可以分出左子树和右子树。接着,递归调用 `buildTree` 函数,分别构建左子树和右子树,并将其作为当前根节点的左右子节点。最后,返回根节点。 在 `main` 函数中,我们可以定义中序遍历数组 `in` 和后序遍历数组 `post`,并将其传入 `buildTree` 函数。代码执行完毕后,我们就得到了一棵二叉树的根节点。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值