【LeetCode】Binary Tree Inorder Traversal二叉树的中序遍历

来源:互联网 发布:淘宝运费险怎么买 编辑:程序博客网 时间:2024/05/22 14:06

二叉树的中序遍历
给出一棵二叉树,返回其中序遍历

样例
给出二叉树 {1,#,2,3},

1
\
2
/
3
返回 [1,3,2].

挑战
你能使用非递归算法来实现么?

(1)Java

package BinaryTreeTraversal;import java.util.ArrayList;import java.util.List;import java.util.Stack;/** * Definition of TreeNode: * public class TreeNode { *     public int val; *     public TreeNode left, right; *     public TreeNode(int val) { *         this.val = val; *         this.left = this.right = null; *     } * } */// 中序遍历: left root right ---非递归:用stack实现,需要先放入root,后放入left。而子right应作为新的root重新进入内层循环。public class BinaryTreeInorderTraversal {    /*    * @param root: A Tree    * @return: Inorder in ArrayList which contains node values.    */    public List<Integer> inorderTraversal(TreeNode root) {        //先将根压栈,将一连串最左节点压栈。在当前子树左节点为null时,将上一个节点(栈顶元素)弹栈,并放入result;然后,再看其右子树(进入递归,让其左节点再次进入内层循环)。        Stack<TreeNode> stack = new Stack<TreeNode>();        List<Integer> result = new ArrayList<Integer>();        TreeNode cur = root;        while(cur != null || !stack.empty()){            while(cur != null){//每次进入内层while的cur都是 new root!                stack.add(cur);                cur = cur.left;//left            }            //cur == null, 退出while循环            cur = stack.pop();//重新赋值cur为栈顶元素(并弹栈)(此时新root的 left,root遍历ok,还剩right未遍历、新root还未放入result)            result.add(cur.val);//并将栈顶元素cur放入result (old left ->没有左节点的 new root)            cur = cur.right;// new right -> newest root(再次进入内层循环后,一旦其左节点遍历结束,便再次跳出内层循环)        }        return result;    }}②//Version 2: Recursionpublic class Solution {    /*     * @param root: A Tree     * @return: Inorder in ArrayList which contains node values.     */    public List<Integer> inorderTraversal(TreeNode root) {        List<Integer> result = new ArrayList<Integer>();        traverse(root, result);        return result;    }    private void traverse(TreeNode root, List<Integer> result){        if(root == null){            return;        }        traverse(root.left, result);        result.add(root.val);        traverse(root.right, result);    }}③Divide & Conquer// Version 3: Divide & Conquerpublic class Solution {    /*     * @param root: A Tree     * @return: Inorder in ArrayList which contains node values.     */    public List<Integer> inorderTraversal(TreeNode root) {        List<Integer> result = new ArrayList<Integer>();        if(root == null){            return result;        }        //Divide        List<Integer> left = inorderTraversal(root.left);        List<Integer> right = inorderTraversal(root.right);        //Conquer        result.addAll(left);        result.add(root.val);        result.addAll(right);        return result;    }}

(2)C++

#include <vector>using namespace std;/** * Definition of TreeNode: * class TreeNode { * public: *     int val; *     TreeNode *left, *right; *     TreeNode(int val) { *         this->val = val; *         this->left = this->right = NULL; *     } * } */class Solution {    /**     * @param root: The root of binary tree.     * @return: Inorder in vector which contains node values.     */public:    vector<int> inorder;    void traverse(TreeNode *root) {        if (root == NULL) {            return;        }        traverse(root->left);        inorder.push_back(root->val);        traverse(root->right);    }    vector<int> inorderTraversal(TreeNode *root) {        inorder.clear();        traverse(root);        return inorder;        // write your code here    }};
阅读全文
0 0
原创粉丝点击