51.二叉树的下一个结点
题目内容:
代码及思路:
以上图的二叉树为例(后边附上包含父节点二叉树的树创建)
void buildtree(TreeNode** root)
{
int temp;
cin >> temp;
if (temp == 0)
{
(*root)->val = 0;
(*root) = nullptr;
return;
}
else
{
(*root)->val = temp;
(*root)->left = new TreeNode;
(*root)->left->father = *root;
buildtree(&(*root)->left);
(*root)->right = new TreeNode;
(*root)->right->father = *root;
buildtree(&(*root)->right);
}
}
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
//对无效输入进行判断
if (pNode == nullptr)
return nullptr;
//如果该结点有右子树,则它的下一个结点就是右子树中最左的子节点
if (pNode->right != nullptr)
{
TreeLinkNode* pRight = pNode->right;
while (pRight->left != nullptr) //找到最左的子节点
{
pRight = pRight->left;
}
return pRight;
}
//如果没有右子树,有以下两种情况:
//1)该结点是父节点的左子节点,则它的下一个结点为父子节点
//2)该结点是父节点的右子节点且没有右子树,如二叉树中的i结点,一直追溯到父节点a为它的下一个结点
while (pNode->next != nullptr) //寻找父节点
{
TreeLinkNode* pRoot = pNode->next;
//如果是情况1
if (pRoot->left == pNode)
return pRoot;
//如果是情况2
pNode = pNode->next;
}
return nullptr;
}