【剑指offer】08二叉树的下一个节点,C++实现

本文介绍了一种特殊的二叉树遍历算法,通过该算法可以高效地找到二叉树中任意节点的下一个节点。文章详细阐述了三种情况:有右子节点时的情况、无右子节点但为父节点左子节点时的情况以及无右子节点且为父节点右子节点时的情况,并提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原创博文,转载请注明出处!

# 题目

image

image

父节点指向子节点的指针用实线表示,从子节点指向父节点的指针用虚线表示。

# 思路
  • 如果节点有右子节点,则右子节点的最左节点是该节点的下一个节点。例如,寻找b的下一个节点的过程(b有右子节点e,e的左子节点是h,且h是e的最左节点,h是b的下一个节点)
  • 如果节点无右子节点,但该节点是父节点的左子节点,则父节点是该节点的下一个节点。例如,寻找d的下一个节点的过程(d无右子节点,d是父节点b的左子节点,则b是de的下一个节点)
  • 如果节点无右子节点,且该节点是父节点的右子节点,则沿着父节点的指针向上遍历。例如,寻找i的下一个节点的过程(i的父节点e,e是其父节点b的右子节点,节点b是其父节点a的左子节点,节点a是节点i的下一个节点)
# 代码
  1 /*
  2 struct TreeLinkNode {
  3     int val;
  4     struct TreeLinkNode *left;
  5     struct TreeLinkNode *right;
  6     struct TreeLinkNode *next;
  7     TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
  8 
  9     }
 10 };
 11 */
 12 class Solution {
 13 public:
 14     TreeLinkNode* GetNext(TreeLinkNode* pNode)
 15     {
 16         // 特殊输入
 17         if(pNode == nullptr)
 18             return nullptr;
 19 
 20         /* 寻找结果 */
 21         // 如果节点有右子节点,则右子节点的最左节点是该节点的下一个节点
 22         // 如果节点无右子节点,但该节点是其父节点的左子节点,则父节点是该节点的下一个节点
 23         // 如果节点无右子节点,且该节点是其父节点的右子节点,则沿着父节点向上遍历,满足XXX的父节点是其该节点的下一个节点
 24         TreeLinkNode * res = nullptr;
 25         if(pNode->right != nullptr)
 26         {
 27             TreeLinkNode* node_right = pNode->right;
 28             while(node_right ->left != nullptr)
 29             {
 30                 node_right = node_right->left;
 31             }
 32             res = node_right;
 33         }
 34 
 35         else if(pNode->next != nullptr)
 36         {
 37             // 当前节点和当前节点的父节点
 38             TreeLinkNode * current = pNode;
 39             TreeLinkNode * parent = pNode->next;
 40 
 41             while(parent!=nullptr && current == parent->right)
 42             {
 43                 current = parent;
 44                 parent = parent ->next;
 45             }
 46 
 47             res = parent;
 48         }
 49         return res;
 50     }
 51 };
View Code
# 复杂度

 

# 测试用例
  • 空节点
  • 特殊二叉树(只有一个节点的二叉树、只有左子节点的二叉树、只有右子节点的二叉树、完全二叉树和不完全二叉树)
  • 不同位置的节点的下一个节点(下一个节点是当前节点右子节点、右子树的最左子节点、父节点、跨层父节点、无下一个节点)

 

转载于:https://www.cnblogs.com/wanglei5205/p/9068827.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值