
有四种情况:
1.该节点有右孩子:则取该右孩子的最左孩子节点返回
2.该节点无右孩子,但它是父节点的左孩子: 直接返回左孩子
3.该节点无右孩子,但他是父节点您的右孩子:一直往上走,直到找到一个节点 ,它是父节点的左孩子
4.该节点无右孩子,但他是父节点您的右孩子:一直往上走,但找不到一个节点 ,它是父节点的左孩子,直到走出根节点。
#include<iostream>
using namespace std;
struct TreeNode
{
int value;
TreeNode* left;
TreeNode* right;
TreeNode* parent;
};
TreeNode* getRightMostLeft(TreeNode* node);
TreeNode* getNextNode(TreeNode* node);
TreeNode* getTree(int arr[],int length,int i,TreeNode* par);
int main(){
int arr[] = {1,2,3,4,5,6,7};
int length = sizeof(arr)/sizeof(arr[0]);
TreeNode* head = getTree(arr, length,0,nullptr);
// TreeNode* node = head;//6
// TreeNode* node = head->left;//5
// TreeNode* node = head->left->left;//2
// TreeNode* node = head->left->right;//1
// TreeNode* node = head->right->right;//nullptr
if(getNextNode(node)!= nullptr){
cout << getNextNode(node)->value;
}else{
cout << "nullptr" << endl;
}
return 0;
}
TreeNode* getTree(int arr[],int length,int i,TreeNode* par){
if(i < length){
TreeNode* node = new TreeNode();
node->value = arr[i];
node->parent = par;
if((2*i+1) < length){
node->left = getTree(arr, length, 2*i+1,node);
}else{
node->left = nullptr;
}
if((2*i+2)<length){
node->right = getTree(arr, length,2*i+2,node);
}else{
node->right = nullptr;
}
return node;
}
return nullptr;
}
TreeNode* getNextNode(TreeNode* node){
if(node == nullptr){
return nullptr;
}
if(node->right != nullptr){
return getRightMostLeft(node->right);
}else{
TreeNode* parent = node->parent;
while(parent!=nullptr && parent->left != node){
node = parent;
parent = node->parent;
}
return parent;
}
}
TreeNode* getRightMostLeft(TreeNode* node){
if(node == nullptr)
return nullptr;
while(node->left != nullptr){
node = node->left;
}
return node;
}

本文介绍了一种在二叉树中寻找指定节点下一个节点的方法,具体包括四种情况的处理方式,并提供了实现这些逻辑的C++代码示例。
1323

被折叠的 条评论
为什么被折叠?



