题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
第一种解法:
将树的结点按照中序遍历都存入数组中,然后遍历数组
//中序遍历
void in_order(TreeLinkNode* root,vector<TreeLinkNode*> &v ){
if(root != NULL){
in_order(root->left,v);
v.push_back(root);
in_order(root->right,v);
}
}
//二叉树的下一个结点
TreeLinkNode* GetNext(TreeLinkNode* pNode){
if(pNode == NULL){
return NULL;
}
TreeLinkNode* p = pNode;
while(p->next){//找到树的根结点
p = p->next;
}
vector<TreeLinkNode*> v;
in_order(p,v);
int i = 0;
for(i = 0;i < v.size();i++){
if(v[i] == pNode){
break;
}
}
return v[i+1];
}
第二种解法:
1、如果该结点存在右子树,则找到右子树的最左结点;
2、如果该结点不存在右子树,则寻找父结点,直到它是父结点的左子树,打印父结点 。
TreeLinkNode* GetNext(TreeLinkNode* pNode){
if(pNode == NULL){
return NULL;
}
TreeLinkNode* tempNode = pNode;
if(tempNode->right){//如果存在右子树,则找到右子树的最左结点
tempNode = tempNode->right;
while(tempNode->left){
tempNode = tempNode->left;
}
return tempNode;
}else{//不存在右子树,则寻找父结点,直到它是父结点的左子树,打印父结点
while(tempNode->next){
if(tempNode->next->left == tempNode){
return tempNode->next;
}
tempNode = tempNode->next;
}
}
return NULL;
}