力扣题解-94. 二叉树的中序遍历

题目:94. 二叉树的中序遍历

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

示例:

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

   1
    \
     2
    /
   3

输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

树一种特殊的图,是连通的,无回路的无向图。

因此,二叉树的搜索也称二叉树的遍历,同样有深度优先遍历和广度优先遍历两种方式。

广度优先遍历也称为层序遍历,遍历原则为:以树的根节点开始,按照树的高度由低到高,一层一层地遍历下去,每一层按照从左至右的顺序遍历,直至到达树的最大深度,遍历完全部节点为止。

深度优先遍历,遍历原则为:从树的根节点开始,沿着左子树进行深度遍历,直到到达叶子节点为止;然后回溯到根节点,进行右子树的深度遍历,直到遍历完所有节点。

具体的,按照根节点相对于子节点的访问顺序,可进一步分为前序遍历、中序遍历和后序遍历。

这里固定左节点和右节点的遍历顺序,那么:

前序(pre-order)指先访问根节点,再遍历左子树和右子树;

中序(in-order)是指先遍历左子树,接着访问根节点,最后遍历右子树;

后序(post-order)是指先遍历左子树,接着遍历右子树,最后访问根节点。

代码

递归

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;
        inorder(root, ans);
        return ans;
    }

    void inorder(TreeNode* node, vector<int>& ans) {
        if (node == NULL) {
            return;
        }
        inorder(node->left, ans);
        ans.push_back(node->val);
        inorder(node->right, ans);
    }
};

栈的迭代

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;
        stack<TreeNode*> stk;

        while (root or !stk.empty()) {
            while (root != NULL) {
                stk.push(root);
                root = root->left;
                //沿着根节点及左子树这条路径遍历到底,并将节点放入栈中
            }
            //访问根节点及左子树这条路径上的节点
            TreeNode* node = stk.top();
            stk.pop();
            ans.push_back(node->val);

            //按照同样的策略,深度遍历右子树
            root = node->right;
        }
        return ans;
    }
};

你可能感兴趣的:(Binary,Tree,二叉树,dfs,leetcode)