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

这个题要认真分析一下。。。

Solution1:

自己想出来的破算法

/*
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) { //中序遍历:左根右;//case1:最简单的情况if(pNode == NULL) //空指针,返回NULLreturn NULL;//case2:pNode无父结点的情况TreeLinkNode *temp;if(pNode->next == NULL) {if(pNode->right) { //有右子结点!temp = pNode->right;while(temp->left != NULL)temp = temp->left;return temp;}else return NULL;}//case3:pNode是父结点的左子结点if(pNode == pNode->next->left) {if(pNode->right) { //有右子结点!temp = pNode->right;while(temp->left != NULL)temp = temp->left;return temp;}else return pNode->next;}//case4:pNode是父结点的右子结点,最麻烦if(pNode == pNode->next->right) {if(pNode->right) {//是父结点的右子结点且有右子结点temp = pNode->right;while(temp->left != NULL)temp = temp->left;return temp;}else { //是父结点的右子结点但没有右子结点,有点麻烦了。。temp = pNode->next; //把temp指针指向当前结点的父结点while(temp->next != NULL) {if(temp == temp->next->left) return temp->next;else temp = temp->next;}return NULL;}}return NULL;}
};

Solution2:

参考网址:https://www.nowcoder.com/profile/2044032/codeBookDetail?submissionId=19265891
分析二叉树的下一个节点,一共有以下情况:
1.二叉树为空,则返回空;
2.节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;
3.节点不是根节点。如果该节点是其父节点的左孩子,则返回父节点;否则继续向上遍历其父节点的父节点,重复之前的判断,返回结果。代码如下:
这样想思路更清晰,代码更简洁~

/*
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==NULL)return NULL;if(pNode->right!=NULL){pNode=pNode->right;while(pNode->left!=NULL)pNode=pNode->left;return pNode;}  while(pNode->next!=NULL){TreeLinkNode *proot=pNode->next;if(proot->left==pNode)return proot;pNode=pNode->next;}return NULL;}
};

20180911日,按照solution2的方案重新写一下

/*
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 *cur = pNode->right;while (cur->left)cur = cur->left;return cur;} else { //没有右子树while (pNode->next) {TreeLinkNode *pRoot = pNode->next;if (pRoot->left == pNode)return pRoot;pNode = pNode->next;}return NULL;}}
};

剑指offer——面试题58:二叉树的下一个结点相关推荐

  1. 剑指offer面试题[58]-二叉树的下一个结点

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. /* struct TreeLinkNode {int ...

  2. 剑指offer(C++)-JZ8:二叉树的下一个结点(数据结构-树)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结 ...

  3. 剑指offer面试题[19]-二叉树的镜像

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8/ \6 10/ \ / \5 7 9 11镜像二叉树8/ \10 6/ \ / \11 9 7 5 ...

  4. 剑指offer面试题34. 二叉树中和为某一值的路径(先序遍历)(回溯)

    题目描述 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 思路 详见链接 代码 class Solution:def ...

  5. 剑指offer面试题27. 二叉树的镜像(递归)

    题目描述 请完成一个函数,输入一个二叉树,该函数输出它的镜像. 思路 详见链接 代码 class Solution:def mirrorTree(self, root:TreeNode)->Tr ...

  6. 剑指Offer - 面试题58 - II. 左旋转字符串

    1. 题目 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转 ...

  7. 剑指offer 面试题58 - II. 左旋转字符串

    字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结 ...

  8. 剑指offer面试题58 - II. 左旋转字符串(切片)(一行代码)

    题目描述 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两 ...

  9. 剑指offer面试题58 - I. 翻转单词顺序(双指针)

    题目描述 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a student. ",则输出&quo ...

最新文章

  1. Python 列表List 的使用
  2. 【转】Monkey测试5-运行中停止monkey
  3. mysql 8.0免安装配置_Mysql8.0免安装包配置方法
  4. stdthread(7)并发unique_lock
  5. 关闭NPC call(__)
  6. powerbuilder中实现多线程同步查询_Power Query中的“追加查询”可以实现合并多个工作表和工作簿...
  7. 给程序员的10条建议
  8. Java ByteArrayInputStream skip()方法与示例
  9. getwayworker timer_Java定时器之Timer学习二
  10. android studio 新建工程慢,关于AndroidStudio新建与编译项目速度慢解决办法
  11. JSON序列——主从表查询
  12. UTF-8 Unicode ANSI网页编码的区别
  13. 【ARM】【NEON加速介绍】
  14. 微型计算机控制技术第二版第六章课后答案,微型计算机控制技术第6章习题答案...
  15. 使用docker搭建视频流服务器
  16. Office 2013 Excel 转换 Word
  17. 阿里云在线温湿度-小熊派qpython(综合展示)
  18. [SSL_CHX][2021-8-18]角谷猜想
  19. python中的Empty suite
  20. 模拟复杂红绿灯交通指示程序编程显示黄灯闪烁箭头指示

热门文章

  1. vscode 连接服务器jupyter_VScode中使用jupyter notebook
  2. springboot 监听所有异常_SpringBoot 全局异常配置及返回自定义页面
  3. react echarts 绘制带有滑块柱图
  4. 在线计算机 授课,在线计算机教育网站计蒜客改版 推出算法竞赛课程
  5. python求字符组合_python – 生成一个潜在的8个字符串的所有可能的2个字符组合?...
  6. python堆栈汉诺塔非递归_汉诺塔问题的递归解法和非递归解法(python语言实现)...
  7. python接口封装_Python 接口测试之接口关键字封装
  8. python数据加载常规教程_Python加载数据的5种不同方式(收藏)
  9. python print tab_python print tab_Python 字符串 expandtabs() 方法
  10. 顺德职业技术学院计算机专业录取线,顺德职业技术学院录取分数线2021是多少分(附历年录取分数线)...