题目描述
leetcode_hot100_94
给定一个二叉树的根节点 root ,返回它的中序遍历 。
正解一(递归)
思路:向左走->打印当前node值->向右走
补充:
前序:打印->左->右
后序:左->右->打印
/**
* 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> res;
vector<int> inorderTraversal(TreeNode* root) {
func(root);
return res;
}
void func(TreeNode* node_){
if(node_==nullptr){
return ;
}
func(node_->left);
res.push_back(node_->val);
func(node_->right);
}
};
正解二(迭代/栈)
用栈作为辅助,先一路向左走左子树(p=p->left)并将路过的都压入栈中,直到指针p==null,此时p往回走到上一个即此时栈顶元素,打印该元素值并将该node弹出栈,然后访问它的右子树(p=p->right),直到弹出栈所有元素。
/**
* 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) {
stack<TreeNode*> tp;
vector<int> res;
TreeNode* curp=root;
while(curp!=nullptr || !tp.empty()){
if(curp!=nullptr){//走到有结点的地方
tp.push(curp);//当前结点压栈
curp=curp->left;//走左子树
}else{//走到叶子结点以下了(没指到结点)
curp=tp.top();//返回上一层(即叶子结点,即栈顶)
res.push_back(curp->val);//打印栈顶
tp.pop();//弹出栈顶
curp=curp->right;//走完了左子树这时候该走右子树了
}
}
return res;
}
};
补充:前序迭代/栈
/**
* 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> preorderTraversal(TreeNode* root) {
stack<TreeNode*> tp;
vector<int> res;
TreeNode* p=root;
if(p==nullptr){
return res;
}
while(p!=nullptr || !tp.empty()){
while(p!=nullptr){//每经过一个结点都打印
res.push_back(p->val);
tp.push(p);
p=p->left;//先走左子树
}
p=tp.top();//走到叶子结点以下时应返回叶子结点处(即栈顶)
tp.pop();
p=p->right;//走完了根、左子树,这时候走右子树
}
return res;
}
};