D是Degree,后续遍历就是LRD,前序遍历就是DLR。

面试题33:BST的后序遍历序列

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

后序遍历是左右中,而根据BST的特性,这个序列中的数字大小情况是小大中,以最后一个结点根节点为基准,可以判断这一层是不是符合要求,同时也划分出了左右子树,再分别对左右子树做递归地判断。

#include<bits/stdc++.h>
using namespace std;// 参数:
//        sequence:       后续遍历序列
//        length:         序列的长度
// 返回值:
//        这个后序遍历序列能否属于某BST(二叉搜索树)
bool VerifySquenceOfBST(int sequence[], int length) {if(sequence == nullptr || length <= 0)//输入合法性校验 return false;int root = sequence[length - 1];//根节点是最后一个结点 //在二叉搜索树中左子树的结点小于根结点 int i = 0;for(; i < length - 1; ++ i) {//左右中,所以从左向右扫描if(sequence[i] > root)//发现第一个大于根节点的值 break;//这时就退出,i点左侧的全部值属于左子树 }//在二叉搜索树中右子树的结点大于根结点int j = i;//从刚刚找到的分界位置 for(; j < length - 1; ++ j) {//继续向后检查应当是右子树的部分 if(sequence[j] < root)//如果发现比根结点小的值 return false;//说明该序列不满足要求,绝不是BST的后续遍历序列 }//判断左子树是不是二叉搜索树bool left = true;if(i > 0)//分界点i>0左子树才是真实存在的,即至少有个sequence[0]结点\//分界点i正好表示其左侧的结点数,即左子树结点数 left = VerifySquenceOfBST(sequence, i);//判断右子树是不是二叉搜索树bool right = true;if(i < length - 1)//分界点i不到达根结点位置,右子树才是真实存在的//序列起始点要跳过i个左子树结点,序列长度要减掉1个根节点和i个左子树结点 right = VerifySquenceOfBST(sequence + i, length - i - 1); //左右子树都为BST时,在该子树上才能认为是BST return (left && right);
}//            10
//         /      \
//        6        14
//       /\        /\
//      4  8     12  16
int main() {int data[] = {4, 8, 6, 12, 16, 14, 10};cout<<boolalpha<<VerifySquenceOfBST(data,sizeof(data)/sizeof(int));return 0;
}

面试题34:二叉树中和为某一值的路径

输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

DFS遍历这棵二叉树,然后每次走到叶结点就判断一下是否满足条件。可以用前序遍历即中左右来DFS这棵二叉树。

#include<bits/stdc++.h>
#include "../Utilities/BinaryTree.h"
using namespace std;void FindPath(BinaryTreeNode* pRoot, int expectedSum, std::vector<int>& path, int& currentSum);// 参数:
//        pRoot:         二叉树根
//        expectedSum:   想检查的路径和
// 输出:
//        找到的路径
void FindPath(BinaryTreeNode* pRoot, int expectedSum) {if(pRoot == nullptr)return;//用vector模拟栈,因为打印路径时需要得到路径上所有结点,stack不方便vector<int> path;int currentSum = 0;//当前路径上的加和FindPath(pRoot, expectedSum, path, currentSum);
}//递归函数,在二叉子树上,根据当前已检查到的路径和继续检查,直到叶子
void FindPath
(BinaryTreeNode*   pRoot,       //二叉(子)树根int               expectedSum, //想检查的路径和vector<int>&      path,          //记录当前路径上结点的栈int&              currentSum   //当前路径上的加和
) {currentSum += pRoot->m_nValue;  //当前路径和要加上这个子树的根值path.push_back(pRoot->m_nValue);//将其加入到栈中(尾入)//判断是否叶子:左右孩子都为空就是叶结点bool isLeaf = pRoot->m_pLeft == nullptr && pRoot->m_pRight == nullptr;//如果路径上结点的和等于输入的值,并且是叶结点if(currentSum == expectedSum && isLeaf) {//这时就找到了这条路径printf("A path is found: ");//用迭代器从头到尾输出这条路径上的结点值vector<int>::iterator iter = path.begin();for(; iter != path.end(); ++ iter)printf("%d\t", *iter);printf("\n");}//如果不是叶结点,则遍历它的子结点if(pRoot->m_pLeft != nullptr)FindPath(pRoot->m_pLeft, expectedSum, path, currentSum);if(pRoot->m_pRight != nullptr)FindPath(pRoot->m_pRight, expectedSum, path, currentSum);//在返回到父结点之前,在路径上删除当前结点path.pop_back();//将其弹出(尾出)//并在当前路径和中减去这个结点的值currentSum -= pRoot->m_nValue;
}//            10
//         /      \
//        5        12
//       /\
//      4  7
int main() {BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);BinaryTreeNode* pNode12 = CreateBinaryTreeNode(12);BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);ConnectTreeNodes(pNode10, pNode5, pNode12);ConnectTreeNodes(pNode5, pNode4, pNode7);FindPath(pNode10,22);DestroyTree(pNode10);return 0;
}

【LRD,DLR】BST的后续遍历序列,二叉树中和为某一值的路径相关推荐

  1. 《剑指offer》-- 从上往下打印二叉树、二叉搜素树的后序遍历、二叉树中和为某一值的路径、二叉树与双向链表

    一.从上往下打印二叉树: 1.题目: 上往下打印出二叉树的每个节点,同层节点从左至右打印. 2.解题思路: 用arraylist模拟一个队列来存储相应的TreeNode. 3.代码实现: public ...

  2. 数据结构与算法-- 二叉树中和为某一值的路径

    二叉树中和为某一值的路径 题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为给定值的所有路径.从树的根节点开始往下一只到叶子节点所经过的节点形成一条路径. 我们用二叉树节点的定义沿用之前文章中 ...

  3. 剑指offer:面试题34. 二叉树中和为某一值的路径

    题目:二叉树中和为某一值的路径 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和  ...

  4. 《剑指offer》— JavaScript(24)二叉树中和为某一值的路径

    二叉树中和为某一值的路径 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路 前序遍历二叉树, ...

  5. 剑指 Offer 34. 二叉树中和为某一值的路径【附完整可运行代码】

    立志用最少的代码做最高效的表达 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和 ...

  6. C#刷剑指Offer | 二叉树中和为某一值的路径

    [C#刷题]| 作者 / Edison Zhou 这是EdisonTalk的第292篇原创内容 我们来用之前学到的数据结构知识来刷<剑指Offer>的一些核心题目(精选了其中30+道题目) ...

  7. 【重点】剑指offer——面试题25:二叉树中和为某一值的路径

    剑指offer--面试题25:二叉树中和为某一值的路径 参考网址:https://www.nowcoder.com/profile/5488508/codeBookDetail?submissionI ...

  8. 【LeetCode】剑指 Offer 34. 二叉树中和为某一值的路径

    [LeetCode]剑指 Offer 34. 二叉树中和为某一值的路径 文章目录 [LeetCode]剑指 Offer 34. 二叉树中和为某一值的路径 package offer;import ja ...

  9. [二叉树]二叉树中和为某一值的路径 (剑指offer24)

    输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 解题思路: 本问题是典型的二叉树方案搜索问题,使用回溯法解决,其包含 ...

最新文章

  1. 深度|全面了解一下这个世界上最奇葩的公司:Google!
  2. 软件界面中英文对照_再也不用翻译软件了,弱电行业术语大全及中英文对照表来了~...
  3. JavaScript面向对象编程之Singleton类
  4. vue + element 顶部二级菜单_揭秘vue/react组件库中5个quot;作者不造的轮子quot;
  5. 深入理解 ValueTask
  6. NFS配置及开机自动挂载
  7. 倒数58天 -- 分治法 -- 使用循环求方程的一个解
  8. 应届毕业生面试软件测试工程师时应注意什么?
  9. zTree根据ID选中节点
  10. GDI+_VB6_ARGB
  11. 【POJ3525】Most Distant Point from the Sea(半平面交+二分+直线平移)
  12. 2020软考软件设计师--基础知识实战培训视频-任铄-专题视频课程
  13. Python smtp拟人个性化群发邮件,imap退信批量处理和SuiteCRM结合使用问题
  14. 如何将 png/jpg 图片转换为 eps
  15. virtualbox 鼠标无法从虚拟电脑移除该怎么处理
  16. php微信支付返回值,php微信支付全记录
  17. 计算机网络课后答案(朱晓姝版)
  18. 视频 TS 内容详细讲解
  19. 你都用 Python 来做什么 学Python能做什么
  20. python绘制heart

热门文章

  1. WPS加载项系列(2)第二个WPS项目
  2. 支付宝集五福最全攻略,五分钟集齐五福!
  3. HTML+CSS个人笔记
  4. arm开发板(I.MX6U)ping通虚拟机Ubuntu方法
  5. 【180622】VC++不规则窗体编程跳棋游戏实例
  6. 数学建模国赛论文怎么写?
  7. 1183: 【入门】判断能否构成三角形
  8. 怎么把录音导入库乐队_库乐队导入音乐的具体流程讲述
  9. Booting kernel failed
  10. linux6.5安装中文字体,Linux(CentOS6.5)系统安装Windows字体