java:二叉树的先序遍历

【题目描述】:

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

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


   1
    \
     2
    /
   3


return[1,2,3].

Note: Recursive solution is trivial, could you do it iteratively?(递归解是平凡的,你能反复做吗?)


下面先不用递归来解

思路:使用栈存储遍历到节点,我们pop出栈顶节点,记录它的值,然后将它的左右子节点push入栈


剩下的依次类推

遍历的过程用代码写出来是这样的




//构造二叉树

  Definition for binary tree
  public class TreeNode {
      int val;
       TreeNode left;
      TreeNode right;
      TreeNode(int x) { val = x; }
 }

import java.util.*;
public class Solution {
    public ArrayList<Integer> preorderTraversal(TreeNode root) {
        
        Stack<TreeNode>s=new Stack<TreeNode>();
        ArrayList<Integer> li =new ArrayList<Integer>();
        if(root!=null)s.push(root);
        while(!s.isEmpty()){
            TreeNode tmp=s.pop();//取出栈顶元素
            li.add(tmp.val);//将头节点存入链表
            if(tmp.right!=null)s.push(tmp.right);
            /*右子树不为空,入栈,因为栈是先进后出的,所以先存右子树,再存左子树
            这样pop出来才可以先遍历左子树,再遍历右子树
            
            */
            if(tmp.left!=null)s.push(tmp.left);
            
        }
        
        return li;
    }
}


用递归方法来解决


//用递归来解决更加简单

/**

 * Definition for binary tree

 * public class TreeNode {

 *     int val;

 *     TreeNode left;

 *     TreeNode right;

 *     TreeNode(int x) { val = x; }

 * }

 */

import java.util.*;

public class Solution {

    public ArrayList<Integer> preorderTraversal(TreeNode root) {

        

        ArrayList<Integer> list=new ArrayList<Integer>();

        if(root==null)return list;

        list.add(root.val);

        list.addAll(preorderTraversal(root.left));//将左子树遍历的结果添加到链表中

        list.addAll(preorderTraversal(root.right));

        return list;

    }
}



猜你喜欢

转载自blog.csdn.net/sinat_35803474/article/details/70597588