描述
给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示
方法一:暴力解法,中序遍历一遍二叉树,把顺序记录在数组中,然后找到指定节点,返回数组中下一个节点即可(有概率时间通不过
class Solution {
public:
void middle(TreeLinkNode* root,vector<TreeLinkNode*> &ans){
if(root == NULL){
return;
}
middle(root->left, ans);
ans.push_back(root);
middle(root->right, ans);
}
TreeLinkNode* GetNext(TreeLinkNode* pNode) {
TreeLinkNode* root = pNode;
while(pNode->next!=NULL){
root = root->next;
}
vector<TreeLinkNode*> ans;
middle(root, ans);
int n = ans.size();
for(int i=0;i<n;i++){
if(pNode == ans[i] && i+1 != n){
return ans[i+1];
}
}
return NULL;
}
};
方法二:最优
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode) {
if(!pNode){
return pNode;
}
//如果该节点有右子节点,就找到该节点右子节点的最左子节点,就是下一个节点
if(pNode->right){
pNode = pNode->right;
while(pNode->left){
pNode = pNode->left;
}
return pNode;
}
//如果该节点没有右子节点,就移动到它的父节点,如果他是他父节点的左子节点,直接返回父节点,如果不是。则继续移动到下个父节点。
while(pNode->next){
TreeLinkNode* root = pNode->next;
if(root->left == pNode){
return root;
}
pNode = pNode->next;
}
return NULL;
}
};