计算二叉树的下一个节点
分三种情况分别讨论,注意不能访问空指针(非法访问)
/*
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) return nullptr;
// 第一种情况,如果一个节点有右子树,那么中序遍历中下一个元素为其右子树的最左边的节点
if(pNode->right!=nullptr)
{
auto tmp_ptr = pNode->right;
while(tmp_ptr->left){
tmp_ptr = tmp_ptr->left;
}
return tmp_ptr;
}
if(pNode->next == nullptr)
{
return nullptr;
}
// 第二种情况,该节点无右子树,且是父节点的左节点,那么next为其父节点
else if(pNode->next->left == pNode){
return pNode->next;
}
// 第三种情况,该节点无右子树,且是父节点的右节点,
// 那么一直网上查,查到一个左子节点a,则a的父节点就是所求
else{
auto tmp_ptr = pNode->next;
if(tmp_ptr==nullptr) return nullptr;
if(tmp_ptr->next==nullptr) return nullptr;
while(tmp_ptr->next->left != tmp_ptr)
{
tmp_ptr = tmp_ptr->next;
if(tmp_ptr==nullptr || tmp_ptr->next==nullptr)
{
return nullptr;
}
}
return tmp_ptr->next;
}
}
}; 
京公网安备 11010502036488号