剑指offer7-二叉树的下一个结点

一 题目描述

  给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

 

二 解法1

1 分析

  如果该节点有右子树,那么下一个结点就是右子树的最左结点;如果该节点没有右子树但是是父节点的左结点,那么他的父节点就是下一个结点;如果该结点没有右子树但是是父节点的右结点,那么他的下一个结点就是沿着父节点向上遍历直到一个父节点有左子树的父节点。

  时间复杂度为O(logn),空间复杂度为O(1)。

2 代码实现

 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     /*思路:如果该节点有右子树,那么下一个结点就是右子树的最左结点;
15      *     如果该节点没有右子树但是是父节点的左结点,那么他的父节点就是下一个结点;
16      *     如果该结点没有右子树但是是父节点的右结点,那么他的下一个结点就是
17      *     沿着父节点向上遍历直到一个父节点有左子树的父节点。
18      */
19     TreeLinkNode* GetNext(TreeLinkNode* pNode)
20     {
21         //检查输入
22         if (nullptr == pNode)
23             return nullptr;
24         
25         //寻找下一个节点
26         TreeLinkNode *pNextNode = nullptr;
27         //如果该结点有右子树,找右子树最左结点
28         TreeLinkNode *pTemp = nullptr;
29         if (nullptr != pNode->right) {
30             pTemp = pNode->right;
31             while (nullptr != pTemp->left)
32                 pTemp = pTemp->left;
33             pNextNode = pTemp;
34         } else {    //如果该结点没有右子树
35             if (nullptr != pNode->next) {
36                 if (pNode == pNode->next->left)    //当前结点为父节点的左结点
37                     pNextNode = pNode->next;
38                 if (pNode == pNode->next->right) {   //当前结点为父节点的右结点
39                     pTemp = pNode->next;
40                     while (pTemp->next != nullptr && pTemp != pTemp->next->left)
41                         pTemp = pTemp->next;
42                     if (pTemp->next != nullptr)
43                         pNextNode = pTemp->next;
44                 }
45             }
46         }
47         
48         return pNextNode;
49     }
50 };

 

该篇博客为自己学习总结,水平有限,如有错误,欢迎讨论!

posted @ 2019-08-22 16:11  zpchya  阅读(106)  评论(0编辑  收藏  举报