76. Binary Tree Inorder Traversal

来源:互联网 发布:mac如何播放网页视频 编辑:程序博客网 时间:2024/06/05 05:56

Given a binary tree, return the inorder traversal of its nodes' values.

For example:
Given binary tree {1,#,2,3},

   1    \     2    /   3

return [1,3,2].

备注:之前只写了递归的算法,就没有写文章,现在先把递归的算法写上,等后面补上其他的非递归的算法。

 public List<Integer> inorderTraversal(TreeNode root) {      List<Integer> list = new ArrayList<Integer>();if(root == null){return list;}else{list.addAll(inorderTraversal(root.left));list.add(root.val);list.addAll(inorderTraversal(root.right));}return list;    }

方法二:采用迭代的思想中序遍历二叉树。

利用链表和栈实现,node表示入栈的元素,要把其最左分支的所有左孩子都放到栈中,然后弹出的元素popnode即是需要加入到结果list中的,然后判断popnode是否有右孩子,有的话就把其右孩子作为node压入栈中(相当于遍历当前popnode结点的右子树)。继续循环。

/** * 用迭代的思想做二叉树的中序遍历。(自己想的方法) * @param root * @return */public List<Integer> inorderTraversal2(TreeNode root) {List<Integer> list = new ArrayList<Integer>();if(root == null){return list;}else{TreeNode node = root; Stack stack = new Stack();stack.push(node);/*node表示入栈的元素,popnode表示弹栈的元素*/while(!stack.isEmpty()){while(node.left != null){//向左走到尽头,把最左分支的结点都入栈。node = node.left;stack.push(node);}TreeNode popnode= (TreeNode) stack.pop();//弹出栈顶元素list.add(popnode.val);/*如果弹栈的元素有右孩子,则让其右孩子入栈,进行下一次循环*/if(popnode.right != null){node = popnode.right;stack.push(node);}}}return list;}/** * 迭代的思想做。  * 调整方法二中的代码。 */public List<Integer> inorderTraversal3(TreeNode root){List<Integer> list = new ArrayList<Integer>();if(root == null){return list;}else{TreeNode node = root; Stack stack = new Stack();stack.push(node);/*node表示入栈的元素,popnode表示弹栈的元素*/while(!stack.isEmpty()){if(node.left != null){node = node.left;stack.push(node);}else{TreeNode popnode= (TreeNode) stack.pop();//弹出栈顶元素list.add(popnode.val);/*如果弹栈的元素有右孩子,则让其右孩子入栈,进行下一次循环*/if(popnode.right != null){node = popnode.right;stack.push(node);}}}}return list;}


类似的题目有二叉树的前序遍历:http://blog.csdn.net/u010339647/article/details/50505831

0 0
原创粉丝点击