给出某二叉树的中序遍历的某个结点,求其下一个结点,其中二叉树除了有left、right指针指向左右孩子,还有一个next指针指向其父亲。
解题思路:
1.首先给定一个树根,用栈来实现二叉树的中序遍历(leetcode 94题),算法思路:
a.先有pCur指向根结点,
b.在pCur不为空或者栈不为空的时候进入循环
-b1.遍历当前结点,把其左孩子全部入栈
-b2.栈顶结点出栈, vector保存结果
-b3.pCur指向栈顶结点的右孩子。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
if(!root) return vector<int>{};
// vector<int> left = inorderTraversal(root->left);
// vector<int> right = inorderTraversal(root->right);
// left.push_back(root->val);
// left.insert(left.end(), right.begin(), right.end());
// return left;
//--------------分治↑------------------
stack<TreeNode *> stackInorder;
TreeNode *pCur = root;
vector<int> result;
while(pCur || !stackInorder.empty()){
while(pCur){
stackInorder.push(pCur);
pCur = pCur->left; //左孩子全部先入栈
}
TreeNode *popNode = stackInorder.top();//出栈
stackInorder.pop();
result.push_back(popNode->val);//保存出栈结点的结果
pCur = popNode->right;//pCur指向出栈结点的右孩子
}
return result;
}
};
2.求二叉树中序遍历的下一个结点。
思路:给定一个结点pNode,它的中序遍历的下一个结点有可能是它的父亲,因此,需要自底向上地将比它辈分高的结点全部先入栈。 当出栈结点等于pNode的时候,说明下一个出栈结点就是所要求的结果。
/*
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->next && !pNode->right) return nullptr;
stack<TreeLinkNode*> treeStack;
// TreeLinkNode *pCur = pNode->next==nullptr? pNode: pNode->next;
TreeLinkNode *pCur = pNode;
while(pCur->next){
pCur = pCur->next;//找到根
}
int flag = 0;//设定一个标志位来确定给定的结点pNode是否已出栈
while(pCur || !treeStack.empty()){
while(pCur){
treeStack.push(pCur);
pCur = pCur->left;
}
TreeLinkNode *popNode = treeStack.top();
cout << popNode->val << endl;
treeStack.pop();
if(flag == 1 ) return popNode;//pNode结点在上一次循环中已出栈,这次肯定是结果
if(popNode == pNode) flag = 1;
pCur = popNode->right;
}
return nullptr;
}
};