码迷,mamicode.com
首页 > 编程语言 > 详细

LeetCode94 二叉树的中序遍历(C++)

时间:2018-11-07 11:36:29      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:root   roo   void   输出   vector   ret   top   public   ack   

题目描述:

给定一个二叉树,返回它的中序 遍历。

示例:

输入: [1,null,2,3]
   1
         2
    /
   3

输出: [1,3,2]

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

 

数据结构定义:

struct TreeNode {
      int val;
      TreeNode *left;
      TreeNode *right;
      TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 };

 

算法思想:

/*一、递归
    效率较低,了解即可。
二叉树的中序遍历规则:
1. 遍历左子树;
2. 访问根结点; 
3. 遍历右子树 
*/

class Solution {
private:
    void rec(TreeNode* root,vector<int> &ret){
        if(root != NULL){            
            rec(root->left,ret);
            ret.push_back(root->val);
            rec(root->right,ret);
        }
    }
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ret;
        rec(root,ret);
        return ret;
    }
};

 

/*
二、迭代
    效率较高,重点掌握。利用栈实现。思路是从根节点开始,先将根节点压入栈,然后再将其所有左子结点压入栈,然后取出栈顶节点,保存节点值,再将当前指针移到其右子节点上,若存在右子节点,则在下次循环时又可将其所有左子结点压入栈中。这样就保证了访问顺序为左-根-右。
*/
class Solution {
public:
    vector<int> inorderTraversal(TreeNode *root) {
        vector<int> res;
        stack<TreeNode*> s;
        TreeNode *p = root;
        while (p || !s.empty()) {
            while (p) {
                s.push(p);  //将根节点入栈
                p = p->left;  //转到左子树
            }
            p = s.top();    //取出根节点
            s.pop();
            res.push_back(p->val);
            
            p = p->right;   //转到右子树,注意这里p已经变化(取根节点时重新赋值了)
        }
        return res;
    }
};

 

分析总结:

LeetCode94 二叉树的中序遍历(C++)

标签:root   roo   void   输出   vector   ret   top   public   ack   

原文地址:https://www.cnblogs.com/parzulpan/p/9920765.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!