二叉搜索树的后续遍历

二叉搜索树的后续遍历

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

BST后续遍历

class Solution {
public:
    bool VerifySquenceOfBSTCore(vector<int>& sequence,int start,int end){
        // 当前位置与后续位置关系
        // 也是跳出位置的关系
        if(start >= end) return true ;
        int root = sequence[end] ;//根节点,也是中值结点
        int i = start ;
        // 找出前半段小的数据
        while(i<=end && sequence[i] < root){
            ++i ;
        }
        // 判断后一半的问题,如果还有小于根的,则return false
        for(int j = i ; j<=end ; j++){
            //验证后一半
            if(sequence[j] < root){
                return false ;
            }
        }
        // [start,i,end]
        return VerifySquenceOfBSTCore(sequence,start,i-1)
            && VerifySquenceOfBSTCore(sequence,i,end-1) ;
    }
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.size() == 0)
            return  false ;
        return VerifySquenceOfBSTCore(sequence,0,sequence.size()-1) ;
    }
};

解题思路:
二叉搜索树 后序遍历
二叉搜索树:或者是一颗空树,或者是具有下列性质的二叉树:若它的左子树不为空,则左子树上所有结点的值均小于它的根节点的值;若它的右子树不为空,则右子树上所有的结点的值均大于它的根节点的值;
后序遍历:先左子树后右子树最后根
BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x(也就是root结点),如果去掉最后一个元素的 序列T,那么满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列
验证思路:当前序列以及子序列都必须满足上述定义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现二叉搜索树的层次遍历,您可以使用队列数据结构来帮助进行层次遍历。下面是一个使用C语言实现二叉搜索树层次遍历的示例代码: ```c#include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构struct Node { int data; struct Node* left; struct Node* right; }; // 创建新节点struct Node* createNode(int data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); if (newNode == NULL) { printf("内存分配失败!"); exit(1); } newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } // 插入节点到二叉搜索树struct Node* insertNode(struct Node* root, int data) { if (root == NULL) { return createNode(data); } if (data < root->data) { root->left = insertNode(root->left, data); } else if (data > root->data) { root->right = insertNode(root->right, data); } return root; } // 层次遍历二叉树void levelOrderTraversal(struct Node* root) { if (root == NULL) { return; } // 创建一个队列来辅助层次遍历 struct Node** queue = (struct Node**)malloc(sizeof(struct Node*) *100); int front =0, rear =0; // 将根节点入队 queue[rear++] = root; while (front < rear) { struct Node* current = queue[front++]; printf("%d ", current->data); // 将左右子节点入队 if (current->left != NULL) { queue[rear++] = current->left; } if (current->right != NULL) { queue[rear++] = current->right; } } //释放队列内存 free(queue); } int main() { struct Node* root = NULL; // 插入节点到二叉搜索树 root = insertNode(root,50); root = insertNode(root,30); root = insertNode(root,20); root = insertNode(root,40); root = insertNode(root,70); root = insertNode(root,60); root = insertNode(root,80); // 层次遍历二叉树 printf("层次遍历结果:"); levelOrderTraversal(root); return0; } ``` 在上述代码中,我们首先定义了一个二叉树节点结构 `struct Node`,然后使用 `createNode` 函数创建新节点,使用 `insertNode` 函数将节点插入到二叉搜索树中。 在 `levelOrderTraversal` 函数中,我们使用队列来辅助层次遍历。我们通过循环从队列中取出节点,并打印节点的值。然后将该节点的左右子节点(如果存在)入队。直到队列为空。 在 `main` 函数中,我们创建了一个二叉搜索树,并调用 `levelOrderTraversal` 函数进行层次遍历。 运行上述代码,将会输出二叉搜索树的层次遍历结果。例如,对于示例中的二叉搜索树,输出结果为:50307020406080。 希望这个示例代码对您有所帮助!如果您有任何进一步的问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值