题目描述
- 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。
算法分析
- 当前节点无父节点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(); }