做法一:直接求出中序遍历,并用vector容器存储。
/* struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkNode *next; TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) { } }; */ #include <exception> class Solution { public: vector<TreeLinkNode*> nodes; TreeLinkNode* GetNext(TreeLinkNode* pNode) { TreeLinkNode *root = pNode; while(root->next) root = root->next; Inorder(root); int n = nodes.size(); for(int i = 0; i < n - 1; i ++ )//最后一个肯定不存在下一个节点 { if(pNode == nodes[i]){ return nodes[i + 1]; } } return nullptr; } void Inorder(TreeLinkNode* &root){ if(root == nullptr) return;//中序遍历终止条件 Inorder(root->left); nodes.push_back(root); Inorder(root->right); } };
作法二:
二叉树的中序遍历的下一个节点存在三种情况:
1.自身存在右子树,返回右子树的最左边的节点
2.自身是父节点的左子树,则返回父节点
3.自身没有右子树,且自身是父节点的右子树,则沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点,返回它的父节点
/* 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){ TreeLinkNode *rchild = pNode->right; while(rchild->left) rchild = rchild->left; return rchild; } //自身是父节点的左子树,则返回父节点 if(pNode->next && pNode->next->left == pNode) { return pNode->next; } //自身没有右子树,且自身是父节点的右子树,则沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点,返回它的父节点 if(pNode->next){ TreeLinkNode *ppar = pNode->next; while(ppar->next && ppar->right == ppar) ppar = ppar->next; return ppar->next; } return nullptr; } };
标签:结点,right,next,TreeLinkNode,pNode,二叉树,JZ8,root,节点 From: https://www.cnblogs.com/luxiayuai/p/17297722.html