37.二叉樹的前序遍歷

題目:前序遍歷二叉樹

解析:
1.遞歸遍歷

public List<Integer> preorderTraversal1(TreeNode root) {
  List<Integer> list = new ArrayList<Integer>();
  if (root == null) return list;
  preOrder(root,list);
  return list;
 }
 public void preOrder(TreeNode root,List<Integer> list){
  if (root!= null){
   list.add(root.val);
   preOrder(root.left,list);
   preOrder(root.right,list);
  }
 }

2.非遞歸 棧
①前序遍歷是先訪問根節點再訪問根節點的左孩子然後訪問根節點的右孩子;
②因此先考慮將根節點壓入棧中,再訪問根節點,然後將根節點的右孩子左孩子依次壓入棧中;
③第二步的目的是爲了遵循棧的先進後出原則,即根節點出棧之後,緊接着其左孩子出棧右孩子出棧;
④對於每個彈出棧的結點重複②③步驟,即可;

public List<Integer> preorderTraversal2(TreeNode root) {
  List<Integer> list = new ArrayList<Integer>();
  if (root == null) return list;
  Stack<TreeNode> stack = new Stack<TreeNode>();
  stack.push(root);//首先壓入根節點
  while(!stack.isEmpty()){
   TreeNode node = stack.pop();
   list.add(node.val);//首先訪問根節點
    //將根節點的右孩子先入棧
   if (node.right != null){
    stack.push(node.right);
   }
    //將根節點的的左孩子先入棧
   if (node.left != null){
    stack.push(node.left);
   }
  }
  return list;
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章