【劍指Offer】二叉樹的下一個節點:給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。

題目描述

給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。

先來解釋一下這個題目,說實話我第一下沒看懂啥意思。意思就是說比如一個二叉樹的中序遍歷是ABCDEF,然後給你B,讓你把C返回,給你D讓你把E返回。這道題還有一個就是,節點A的父節點是A->next。總感覺這樣表示怪怪的。

思路

我上面那麼一解釋題目,感覺有一個特別蠢笨的方法,找到根節點,把樹的所有節點中序遍歷到一個vector<node*>裏面,然後找到節點pNode 返回下一個元素。這方法太蠢了,首先中序遍歷有用到遞歸,然後還用vector裝,還要最後對vector進行查找遍歷。時間空間複雜度都特別蠢。
下來說一下正常的方法:
(1)當pNode,返回空;
(2)當pNode->right存在的時候,那麼我們就一直找pNode->right的左孩子,直至沒有左孩子。例如給出J節點,讓求K節點。
(3)當pNode->right不存在的時候,那麼我們就一直找pNode的父節點(pNode->next),在找父節點的同時我們要看一下pNode是不是父節點的左孩子,若是左孩子,則直接返回父節點。例如給出 I 節點,讓找出J節點。

在這裏插入圖片描述

代碼

/*
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 == nullptr)//(1)當pNode,返回空
			return nullptr;
		if (pNode->right != nullptr) { //(2)當pNode->right存在的時候
			TreeLinkNode* tmp=pNode->right;
			while (tmp->left != nullptr) {
				tmp = tmp->left;
			}
			return tmp;
		}
		else {
			while (pNode->next != nullptr) { //(3)當pNode->right不存在的時候
				TreeLinkNode* tmp2 = pNode->next;
				if (pNode == tmp2->left)
					return tmp2;
				pNode = pNode->next;
			}
		}
		return nullptr;
	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章