题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。next指针是二叉树的父节点
我的代码:
class Solution { public: vector<TreeLinkNode*> vec; void OrderTrave(TreeLinkNode* pRoot) { OrderTrave(pRoot->left); vec.push_back(pRoot); OrderTrave(pRoot->right); } TreeLinkNode* GetNext(TreeLinkNode* pNode) { if(!pNode) return NULL; TreeLinkNode* pRoot = pNode; while(pRoot->next) pRoot = pRoot->next; OrderTrave(pRoot); for(int i = 0; i < vec.size()-1; i++) { if(vec[i] == pNode) return vec[i+1]; } return NULL; } };
借鉴后的代码:通过
思路:如果节点为NULL,返回NULL
1.如果节点有右子树,那么一直遍历,找到它的最左面的节点
2.节点没有右子树,那么就要向上找。找到他的父节点,看是不是父节点的左孩子,是则返回父节点,不是则将父节点置为当前节点,重复刚才的步骤判断。
补充:如果节点不是父节点的左孩子,那么就继续向上找,直到为父节点的左孩子。到根还没找得到,就是NULL了
1 class Solution { 2 public: 3 TreeLinkNode* GetNext(TreeLinkNode* pNode) 4 { 5 if(!pNode) return NULL; 6 if(pNode->right) 7 { 8 pNode = pNode->right; 9 while(pNode->left) 10 pNode = pNode->left; 11 return pNode; 12 } 13 while(pNode->next) 14 { 15 TreeLinkNode* pRoot = pNode->next; 16 if(pRoot->left == pNode) 17 { 18 return pRoot; 19 } 20 pNode = pNode->next; 21 } 22 return NULL; 23 } 24 };