题目描述
- 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。
算法分析
- 当前节点无父节点pNode->next==nullptr,则返回nullptr;
- 当前节点有右子树pNode->right != nullptr:当前节点为其父节点的左节点pNode->next->left == pNode,则返回其父节点pNode->next;当前节点为其父子树的右节点pNode->next->right == pNode,则向上寻找其父节点pNode = pNode->next,直到当前节点为其左节点pNode->next->left == pNode,返回其父节点pNode->next。
- 当前节点无右子树pNode->right == nullptr,以该节点开始中序遍历该节点。
提交代码:
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if (!pNode)
return pNode;
if (!pNode->right)
{
while (pNode->next && pNode->next->left != pNode)
pNode = pNode->next;
if (pNode->next)
return pNode->next;
else
return nullptr;
}
else
{
pNode = pNode->right;
while (pNode->left)
{
pNode = pNode->left;
}
return pNode;
}
}
};
测试代码:
#include<iostream>
using namespace std;
/*
// 面试题8:二叉树的下一个结点
// 题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?
// 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。
*/
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :
val(x), left(nullptr), right(nullptr), next(nullptr) {
}
};
// ==================== 辅助代码用来构建二叉树 ====================
TreeLinkNode* CreateTreeLinkNode(int value)
{
TreeLinkNode* pNode = new TreeLinkNode(value);
return pNode;
}
void ConnectTreeNodes(TreeLinkNode* pParent, TreeLinkNode* pLeft, TreeLinkNode* pRight)
{
if (pParent != nullptr)
{
pParent->left = pLeft;
pParent->right = pRight;
if (pLeft != nullptr)
pLeft->next = pParent;
if (pRight != nullptr)
pRight->next = pParent;
}
}
void PrintTreeNode(TreeLinkNode* pNode)
{
if (pNode != nullptr)
{
printf("value of this node is: %d\n", pNode->val);
if (pNode->left != nullptr)
printf("value of its left child is: %d.\n", pNode->left->val);
else
printf("left child is null.\n");
if (pNode->right != nullptr)
printf("value of its right child is: %d.\n", pNode->right->val);
else
printf("right child is null.\n");
}
else
{
printf("this node is null.\n");
}
printf("\n");
}
void PrintTree(TreeLinkNode* pRoot)
{
PrintTreeNode(pRoot);
if (pRoot != nullptr)
{
if (pRoot->left != nullptr)
PrintTree(pRoot->left);
if (pRoot->right != nullptr)
PrintTree(pRoot->right);
}
}
void DestroyTree(TreeLinkNode* pRoot)
{
if (pRoot != nullptr)
{
TreeLinkNode* pLeft = pRoot->left;
TreeLinkNode* pRight = pRoot->right;
delete pRoot;
pRoot = nullptr;
DestroyTree(pLeft);
DestroyTree(pRight);
}
}
// ====================测试代码====================
void Test(char* testName, TreeLinkNode* pNode, TreeLinkNode* expected)
{
if (testName != nullptr)
printf("%s begins: ", testName);
Solution s;
TreeLinkNode* pNext = s.GetNext(pNode);
if (pNext == expected)
printf("Passed.\n");
else
printf("FAILED.\n");
}
// 8
// 6 10
// 5 7 9 11
void Test1_7()
{
TreeLinkNode* pNode8 = CreateTreeLinkNode(8);
TreeLinkNode* pNode6 = CreateTreeLinkNode(6);
TreeLinkNode* pNode10 = CreateTreeLinkNode(10);
TreeLinkNode* pNode5 = CreateTreeLinkNode(5);
TreeLinkNode* pNode7 = CreateTreeLinkNode(7);
TreeLinkNode* pNode9 = CreateTreeLinkNode(9);
TreeLinkNode* pNode11 = CreateTreeLinkNode(11);
ConnectTreeNodes(pNode8, pNode6, pNode10);
ConnectTreeNodes(pNode6, pNode5, pNode7);
ConnectTreeNodes(pNode10, pNode9, pNode11);
Test("Test1", pNode8, pNode9);
Test("Test2", pNode6, pNode7);
Test("Test3", pNode10, pNode11);
Test("Test4", pNode5, pNode6);
Test("Test5", pNode7, pNode8);
Test("Test6", pNode9, pNode10);
Test("Test7", pNode11, nullptr);
DestroyTree(pNode8);
}
// 5
// 4
// 3
// 2
void Test8_11()
{
TreeLinkNode* pNode5 = CreateTreeLinkNode(5);
TreeLinkNode* pNode4 = CreateTreeLinkNode(4);
TreeLinkNode* pNode3 = CreateTreeLinkNode(3);
TreeLinkNode* pNode2 = CreateTreeLinkNode(2);
ConnectTreeNodes(pNode5, pNode4, nullptr);
ConnectTreeNodes(pNode4, pNode3, nullptr);
ConnectTreeNodes(pNode3, pNode2, nullptr);
Test("Test8", pNode5, nullptr);
Test("Test9", pNode4, pNode5);
Test("Test10", pNode3, pNode4);
Test("Test11", pNode2, pNode3);
DestroyTree(pNode5);
}
// 2
// 3
// 4
// 5
void Test12_15()
{
TreeLinkNode* pNode2 = CreateTreeLinkNode(2);
TreeLinkNode* pNode3 = CreateTreeLinkNode(3);
TreeLinkNode* pNode4 = CreateTreeLinkNode(4);
TreeLinkNode* pNode5 = CreateTreeLinkNode(5);
ConnectTreeNodes(pNode2, nullptr, pNode3);
ConnectTreeNodes(pNode3, nullptr, pNode4);
ConnectTreeNodes(pNode4, nullptr, pNode5);
Test("Test12", pNode5, nullptr);
Test("Test13", pNode4, pNode5);
Test("Test14", pNode3, pNode4);
Test("Test15", pNode2, pNode3);
DestroyTree(pNode2);
}
void Test16()
{
TreeLinkNode* pNode5 = CreateTreeLinkNode(5);
Test("Test16", pNode5, nullptr);
DestroyTree(pNode5);
}
int main(int argc, char* argv[])
{
Test1_7();
Test8_11();
Test12_15();
Test16();
}