给定一个二叉树,返回它的中序 遍历
知识点
掌握二叉树的遍历方式;
解题思路
解法一:递归法
即二叉树的中序遍历法,遍历访问到该节点,然后操作该节点;
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) { // 向量容器盛放的是 int 类型
// 递归算法,中序遍历
TreeNode* p=root;//point root
static vector<int> ans={};// return answer;
if(p->left!=NULL){
inorderTraversal( p->left);
}
// do something on node
ans.push_back(p->val);
if(p->right!=NULL){
inorderTraversal(p->right);
}
return ans;
}
};
栈迭代方法虽然提高了效率,但其嵌套循环却非常烧脑,不易理解,容易造成“一看就懂,一写就废”的窘况
解法二: 使用栈的通用思想
这题的真正难点在于如何用非递归的方式实现;即用栈的
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> S;
vector<int> v;
TreeNode* rt = root;
while(rt || S.size()){
while(rt){
S.push(rt);
rt=rt->left;
}
rt=S.top();S.pop();
v.push_back(rt->val);
rt=rt->right;
}
return v;
}
** 栈 队列 的思想;树是一种非线性数据结构**
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
while(stack.size()>0 || root!=null) {
//不断往左子树方向走,每走一次就将当前节点保存到栈中
//这是模拟递归的调用
if(root!=null) {
stack.add(root);
root = root.left;
//当前节点为空,说明左边走到头了,从栈中弹出节点并保存
//然后转向右边节点,继续上面整个过程
} else {
TreeNode tmp = stack.pop();
res.add(tmp.val);
root = tmp.right;
}
}
return res;
}
}
小结
虽然今日事今日做,但是不要拖到晚上9点之后再做,否则容易找借口去睡觉