作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示

示例:

输入:{8,6,10,5,7,9,11},8

返回:9

解析:这个组装传入的子树根节点,其实就是整颗树,中序遍历{5,6,7,8,9,10,11},根节点8的下一个节点就是9,应该返回{9,10,11},后台只打印子树的下一个节点,所以只会打印9,如下图,其实都有指向左右孩子的指针,还有指向父节点的指针,下图没有画出来

数据范围:节点数满足1≤n≤50  ,节点上的值满足1≤val≤100

要求:空间复杂度 O(1)  ,时间复杂度 O(n)

示例:

输入:

{8,6,10,5,7,9,11},8

返回值:

9

解题思路:

本题考察数据结构树的使用。两个方法:

1)暴力破解。通过next指针获取根结点,对其进行中序排序,排序过程中用vector存储,然后直接根据位置输出即可。

2)结合中序排序性质。若某个结点存在右子树,则右子树的最左孩子就是它的下一个结点;若不存在右子树,则它的第一个右父亲,就是它的下一个结点。

测试代码:

1)暴力破解。

/*
struct TreeLinkNode {int val;struct TreeLinkNode *left;struct TreeLinkNode *right;struct TreeLinkNode *next;TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {}
};
*/
class Solution {
public:TreeLinkNode* GetNext(TreeLinkNode* pNode) {if(!pNode)return NULL;// 确定根结点TreeLinkNode* root=pNode;while(root->next){root=root->next;}// 中序排序vector<TreeLinkNode*> v;inorder(root,v);for(int i=0;i<v.size();++i){if(v[i]==pNode&&(i+1)<v.size())return v[i+1];}return NULL;}// 排序void inorder(TreeLinkNode* root,vector<TreeLinkNode*> &v){if(!root)return;// 中序排序inorder(root->left,v);v.push_back(root);inorder(root->right,v);}
};

2)结合中序排序性质。

/*
struct TreeLinkNode {int val;struct TreeLinkNode *left;struct TreeLinkNode *right;struct TreeLinkNode *next;TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {}
};
*/
class Solution {
public:TreeLinkNode* GetNext(TreeLinkNode* pNode) {if(!pNode)return NULL;// 判断是否存在右子树if(pNode->right){TreeLinkNode* target=pNode->right;// 取最左孩子while(target->left){target=target->left;}return target;}// 不存在右子树,寻找第一个右父亲while(pNode->next){if(pNode->next->left==pNode)return pNode->next;pNode=pNode->next;}return NULL;}};

剑指offer(C++)-JZ8:二叉树的下一个结点(数据结构-树)相关推荐

  1. 【打卡第243道】【二叉树】【剑指Offer】:JZ8 二叉树的下一个结点

    1.题目描述 2.算法分析 既然是找中序遍历的某一个结点的下一个结点,其实思路已经很明确了.     1.将二叉树中序遍历,存储到集合中.前提,首先找到根节点.根节点可以根据指向父节点的next指针找 ...

  2. 剑指offer——面试题58:二叉树的下一个结点

    剑指offer--面试题58:二叉树的下一个结点 这个题要认真分析一下... Solution1: 自己想出来的破算法 /* struct TreeLinkNode {int val;struct T ...

  3. 《剑指offer》-- 二叉树的下一个结点、对称二叉树、按之字性顺序打印二叉树、把二叉树打印成多行

    一.二叉树的下一个结点: 1.题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 2.解题思路: 分析二叉树 ...

  4. 【LeetCode】剑指 Offer 55 - I. 二叉树的深度

    [LeetCode]剑指 Offer 55 - I. 二叉树的深度 文章目录 [LeetCode]剑指 Offer 55 - I. 二叉树的深度 一.后序遍历(DFS) 二.层序遍历 一.后序遍历(D ...

  5. 【LeetCode】剑指 Offer 37. 序列化二叉树

    [LeetCode]剑指 Offer 37. 序列化二叉树 文章目录 [LeetCode]剑指 Offer 37. 序列化二叉树 package offer;import java.util.Link ...

  6. 【LeetCode】剑指 Offer 07. 重建二叉树

    [LeetCode]剑指 Offer 07. 重建二叉树 文章目录 [LeetCode]剑指 Offer 07. 重建二叉树 package offer;import java.util.ArrayD ...

  7. 【LeetCode】剑指 Offer 68 - II. 二叉树的最近公共祖先

    [LeetCode]剑指 Offer 68 - II. 二叉树的最近公共祖先 文章目录 [LeetCode]剑指 Offer 68 - II. 二叉树的最近公共祖先 一.DFS 一.DFS 祖先的定义 ...

  8. 剑指 Offer II 044. 二叉树每层的最大值

    链接:剑指 Offer II 044. 二叉树每层的最大值 题解: /*** Definition for a binary tree node.* struct TreeNode {* int va ...

  9. 剑指 Offer II 047. 二叉树剪枝

    剑指 Offer II 047. 二叉树剪枝: 题目链接 :剑指 Offer II 047. 二叉树剪枝 题目: 给定一个二叉树 根节点 root ,树的每个节点的值要么是 0,要么是 1.请剪除该二 ...

最新文章

  1. QT5生成可执行文件总结
  2. VTK:PolyData之DownsamplePointCloud
  3. 一朝清明不若鸿蒙什么意思,清明节得名并非源于“气清景明”
  4. pandas入门(2)
  5. Struts2中UI标签之非表单标签
  6. Java面试题:List一边遍历,一边删除
  7. 电脑常用音频剪辑软件_常用的音频编辑软件
  8. ffmpeg命令_温故知新:ffmpeg操作《天空之城》。窗口党勿入,都是指令!
  9. HTML5绘制一个3D立方体,HTML5/Canvas交互式3D立方体
  10. 关于虚拟主机软件配置的问题
  11. Java高级工程师必备技术栈
  12. FPS游戏通用自瞄实现
  13. VMware vCenter Server 7.0 U2b/6.7 U3n/6.5 U3p 修复高危安全漏洞
  14. 备案域名绑定服务器后 提示需要备案_网站空间配置和域名解析怎么选择
  15. 计算机课程微教学设计,计算机基础知识教学设计
  16. SSM源码分析之Spring05-DI实现原理(基于Annotation 注入)
  17. 抖音获客源码,短视频获客系统,获客SaaS有标准答案吗?
  18. php不建议用织梦cms,你不得不知的织梦cms安全性设置常识 - DeDecms
  19. 使用c++实现带分数的运算
  20. python 图像卷积_[卷积神经网络(CNN)中的卷积核到底是如何提取图像特征的(python实现图像卷积运算)]...

热门文章

  1. 一步步实现koa核心代码
  2. php课程 4-16 数组自定义函数(php数组-桶)
  3. 小例子背后的大道理——Adapter模式详解
  4. 989. 数组形式的整数加法
  5. php activerecord,Yii2 优雅的 Active Record
  6. 网络多人游戏架构pdf_21秒看尽ImageNet屠榜模型,60+模型架构同台献艺
  7. 你知道的Python面向对象真的是全面的嘛?看看这个你就知道了
  8. 程序员遇到不认识的花是这样识别的
  9. Python+OpenCV:色彩空间转换
  10. QSerialport多线程方法