leetcode-Binary Tree Inorder Traversal
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]
.
树的中序遍历
package leetcode;
import java.util.*;
//方法一 数据结构:树的中序遍历:1、递归 2、非递归
//始终操作的是根节点 ->( root=root.left),把右边节点移到根节点上进行;
public class BinaryTreeInorderTraversal {
private class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
/*public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
addNode(list,root);
return list;
}
public void addNode(List<Integer> list,TreeNode root){ //参数只能传入List类型,不能传ArrayList类型
if(root == null) return; //什么都不返回
addNode(list,root.left);
list.add(root.val);
addNode(list,root.right);
}*/
//方法二 :思想:1、先找到叶子结点,然后把每个点当作根节点分析,然后逐层出栈(入栈:顶向下;出栈:下向上!)
//非递归方法:1、list用来存储结果;2stack : 用来操作这个树,
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list =new ArrayList();
Stack<TreeNode> stack=new Stack();
if(root==null) return list;
while(root!=null){
stack.push(root);
root=root.left; //先把左边的数都存到栈里,
while(root==null){ //当左子节点为空时(此时其仍为子根节点),
//再往下没有节点,就存入,然后判断有没有右子节点,若有,就以右子节点为根继续遍历
//若没有则,出栈,将元素存入list
if(stack.empty()) return list;
root=stack.pop();
list.add(root.val);
root=root.right;
}
}
return list;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}