二叉搜索树后序遍历序列判定

二叉搜索树想必大家都非常熟悉。它是一颗二叉树,对于任意一个节点n均满足:n的左儿子值比右儿子小,n的右儿子值比左儿子大。

对于二叉搜索树的后序遍历是先访问子树根节点的左子树、右子树,最后在访问子树根节点。

上述二叉搜索树的后序遍历序列:1,7,9,8,5,17,15,20,10.

这里主要是解决二叉搜索树后序遍历序列判定问题,具体描述如下:

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

解决方案:考虑后序遍历最后输出的节点是根节点,则可以根据大小关系,将序列分成三部分:左子树序列,右子树序列,根节点。故而可以判断该序列是否为二叉搜索树后序遍历的结果。

 1 #include <iostream>
 2 #include <vector>
 3 
 4 using namespace std;
 5 
 6 /**
 7  * 递归分解该序列,判断其是否为后序遍历结果
 8  */
 9 bool fun(vector<int> sequence)
10 {
11     int length = sequence.size();
12     //length=0: 某子树只含左或右子树时,另一子数为空
13     //length=1: 某子树不含左右子树
14     if (length <= 1)
15         return true;
16     int root = sequence[length-1];
17     int i = 0, j = length - 2;
18     //得到左子树序列位置
19     while (i < length - 1 && sequence[i] < root)i++;
20     //得到右子树序列位置
21     while (j >= 0 && sequence[j] > root)j--;
22     //若为后序遍历结果,则i,j关系为i=j+1
23     if (i != j + 1)
24         return false;
25     else
26     {
27         vector<int> ltemp;
28         vector<int> rtemp;
29         //得到左子树序列
30         ltemp.insert(ltemp.begin(), sequence.begin(), sequence.begin()+i);
31         //得到右子树序列
32         rtemp.insert(rtemp.begin(), sequence.begin() + j + 1, sequence.end()-1);
33         int ll = ltemp.size();
34         int lr = rtemp.size();
35         //递归判断左子树和右子树
36         return fun(ltemp) & fun(rtemp);
37     }
38 }
39 
40 /**
41  * 判断sequence是否为二叉搜索树后序遍历的结果
42  */
43 bool VerifySquenceOfBST(vector<int> sequence)
44 {
45     //判断序列是否为空
46     if(sequence.size() <= 0)
47         return false;
48     return fun(sequence);
49 }
50 
51 int main()
52 {
53     //测试数据
54     int a[7] = {4,8,6,12,16,14,10};
55     //int a[5] = {5,4,3,2,1};
56     vector<int> sq(a,a+7);
57     int length = sq.size();
58     cout << VerifySquenceOfBST(sq) << endl;
59     return 0;
60 }

转载于:https://www.cnblogs.com/Flian/p/9657691.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉搜索树的定义是:左子树中所有节点的值小于根节点的值,右子树中所有节点的值大于根节点的值,且左右子树都是二叉搜索树。 中序遍历是按照左子树、根节点、右子树的顺序遍历二叉树,如果中序遍历序列是递增的,那么这棵二叉树就是一个二叉搜索树。 以下是Python的代码实现: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def inorderTraversal(root: TreeNode) -> List[int]: """ 中序遍历二叉树,返回遍历序列 """ res = [] if not root: return res stack = [] curr = root while stack or curr: while curr: stack.append(curr) curr = curr.left curr = stack.pop() res.append(curr.val) curr = curr.right return res def isValidBST(root: TreeNode) -> bool: """ 判断给定的二叉树是否是二叉搜索树 """ inorder = inorderTraversal(root) for i in range(1, len(inorder)): if inorder[i] <= inorder[i-1]: return False return True ``` 首先我们定义了一个TreeNode类来表示二叉树的节点。然后我们定义了一个inorderTraversal函数来进行中序遍历,这里我们使用了迭代的方式来遍历二叉树,使用了一个栈来维护遍历的顺序,每次先将左子树的节点全部入栈,然后弹出栈顶节点,将其值加入结果序列,并将右子树的根节点入栈。最后返回遍历序列。 接着我们定义了一个isValidBST函数,这个函数先使用inorderTraversal函数得到给定二叉树的中序遍历序列,然后遍历序列,如果发现当前节点小于等于前一个节点,那么就不是一个二叉搜索树,返回False,否则遍历完整个序列后返回True。 注意,在实际工作中,二叉搜索树的实现可能会更加复杂,例如需要支持插入、删除等操作,需要考虑平衡等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值