剑指offer——35二叉树的后序遍历

题目描述

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

题解:

  这道题,一开始以为将后序遍历排序后的得到中序遍历,然后利用后序遍历和中序遍历进行二叉树的重组,但是由于后序遍历未必是BST树的,故得到的中序遍历未必是正确的;

  所以,根据后序遍历,直接对树的左右子树进行判断。

  

 1 class Solution {
 2 public:
 3     bool VerifySquenceOfBST(vector<int> sequence) {
 4         if (sequence.size() == 0)return false;
 5         return isBST(sequence, 0, sequence.size() - 1);
 6     }
 7     bool isBST(vector<int>v, int L, int R)
 8     {
 9         if (L >= R)return true;
10         int root = v[R];
11         int i = L;
12         while (v[i] < root)++i;//找到左子树
13         int j = i;
14         while (j < R)if (v[j++] < root)return false;//判断右子树
15         return isBST(v, L, i - 1) && isBST(v, i, R - 1);
16     }
17 };

原文地址:https://www.cnblogs.com/zzw1024/p/11681930.html

时间: 2024-11-04 04:38:58

剑指offer——35二叉树的后序遍历的相关文章

23、剑指offer--二叉搜索树的后序遍历序列

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路:本题中的树为二叉搜索树,满足左<根<右 1)求出数组最后一个元素,为根节点 2)遍历,将所有连续小于sequence[n-1]的存入vector left中 3)将连续大于的存入vector right中  如果存在小于的,则直接返回false,无法构造二叉搜索树 4)然后对left进行递归处理,如果right为空则直接返回left_v

剑指——二叉搜索树的后序遍历

二叉搜索树的后序遍历 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路 给出的数组是后序遍历,那么最后一个元素对应着树的根节点. 数组前部分对应左子树,其中元素都小于根节点:后部分对应右子树,其中元素都大于根节点. 再分别对左右子树进行递归地判断. public class Solution { public boolean VerifySquenceOfBST(int [] sequence)

剑指offer---二叉搜索树的后序遍历序列

class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { vector<int> right; vector<int> left; int size = sequence.size(); int last = sequence[size - 1]; if (size== 0) { return false; } //left int mid = 0; for (int i = 0;

剑指Offer-- 二叉搜索树的后序遍历序列判断

版本1:C++ class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { if (sequence.size() == 0) return false; int len = sequence.size(),i = 0,j; int root = sequence[len - 1]; // 根节点 vector<int> leftTree, rightTree; while (sequence[i

剑指offer (24) BST的先序或后序遍历序列的正确性

题目:输入一个整数数组,判断该数组是不是某个二叉搜索树的后序遍历序列 假设输入的数组的数字均不相同 解题分析: 对于二叉搜索树,中序序列一定是升序的,我们将后序遍历序列排序,结果即为 中序遍历序列 如果该后序遍历序列是正确的,那么 由 中序遍历序列和后序遍历序列 一定可以构建一棵二叉树 如果不能成功构建一棵二叉树,那么该后序遍历序列一定是错误的 题目即转化为 由 后序遍历序列和中序遍历序列构建一棵二叉树 主要思路就是 在中序中找根节点然后划分左右子树 详见笔者博文:http://www.cnbl

【剑指offer】二叉树的镜像

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25915971 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.C

剑指OFFER之二叉树的镜像(九度OJ1521)

题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci='l'表示第i个节点有一个左孩子,紧接着是左孩子的编号.Ci='r'表示第i个节点有一个右孩子,紧接着是右孩子的编号.C

剑指offer (19) 二叉树镜像 对称二叉树

题目: 输入一个二叉树,输出其镜像. BinTreeNode* ReverseTree(BinTreeNode* pRoot) { if (pRoot == NULL) return NULL; BinTreeNode* pLeftReverse = ReverseTree(pRoot->left); BinTreeNode* pRightReverse = ReverseTree(pRoot->right); pRoot->left = pRightReverse; pRoot->

剑指offer (39) 二叉树深度

题目:输入一棵二叉树的根节点,求该树的深度 题解分析: 二叉树具有天然的递归性,首先应该想递归解法 /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int maxDept