二叉树的遍历-迭代&递归

144. 二叉树的前序遍历 ??

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {
11     public List<Integer> preorderTraversal(TreeNode root) {
12         List<Integer> res = new ArrayList();
13         Stack<TreeNode> stack = new Stack();
14         if(root==null){
15             return res;
16         }
17
18         stack.push(root);
19         TreeNode cur = null;
20         while(!stack.isEmpty()){
21             cur = stack.pop();
22             res.add(cur.val);
23             if(cur.right!=null){
24                 stack.push(cur.right);
25             }
26             if(cur.left!=null){
27                 stack.push(cur.left);
28             }
29         }
30         return res;
31     }
32 }
 1 class Solution {
 2     public List<Integer> preorderTraversal(TreeNode root) {
 3         List<Integer> res = new ArrayList();
 4         preOrder(root, res);
 5         return res;
 6     }
 7     public void preOrder(TreeNode node, List<Integer> res){
 8         if(node==null){
 9             return;
10         }
11         res.add(node.val);
12         preOrder(node.left, res);
13         preOrder(node.right, res);
14     }
15 }

94. 二叉树的中序遍历 ??

class Solution {
    public List<Integer> inorderTraversal(TreeNode root){
        List<Integer> res = new ArrayList();
        if(root == null){
            return res;
        }
        Stack<TreeNode> stack = new Stack();
        TreeNode cur = root;
        while(cur!=null || !stack.isEmpty()){
            while(cur!=null){
                stack.push(cur);
                cur=cur.left;
            }
            cur=stack.pop();
            res.add(cur.val);
            cur=cur.right;  // 重要!!!
        }
        return res;
    }
}

注:cur=cur.right,下一次遍历如果cur为空,说明stack.pop()的左子树的最右节点已经遍历完了,即左子树遍历完成,不要再去遍历其左子节点,避免陷入死循环。

 1 class Solution {
 2     public List<Integer> inorderTraversal(TreeNode root){
 3         List<Integer> res = new ArrayList();
 4         inOrder(root, res);
 5         return res;
 6     }
 7     public void inOrder(TreeNode node, List<Integer> res){
 8         if(node==null){
 9             return;
10         }
11         inOrder(node.left, res);
12         res.add(node.val);
13         inOrder(node.right, res);
14     }
15 }

145. 二叉树的后序遍历 ??

 1 class Solution {
 2     public List<Integer> postorderTraversal(TreeNode root) {
 3         Stack<TreeNode> stack = new Stack<>();
 4         List<Integer> res = new ArrayList<>();
 5         if(root == null){
 6             return res;
 7         }
 8         stack.push(root);
 9         TreeNode cur = root;
10         TreeNode flag = root;
11         while(!stack.isEmpty()){
12             cur=stack.peek();
13             if((cur.right == null && cur.left == null)
14              || cur.right == flag || cur.left == flag){
15                  res.add(cur.val);
16                  flag=cur;
17                  stack.pop();
18                  continue;
19              }
20             if(cur.right!=null){
21                 stack.push(cur.right);
22             }
23             if(cur.left!=null){
24                 stack.push(cur.left);
25             }
26         }
27         return res;
28     }
29 }

注:为了引起不必要的麻烦和判断,最开始都把cur和flag指向root。(flag如果指向null会有问题的哦)

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        List<Integer> res = new ArrayList<>();
        if(root==null){
            return res;
        }
        TreeNode cur = root;
        stack.push(root);
        while(!stack.isEmpty()){
            cur=stack.pop();
            res.add(0,cur.val);   // (1)
            if(cur.left!=null){
                stack.push(cur.left);
            }
            if(cur.right!=null){
                stack.push(cur.right);
            }
        }
       // Collections.reverse(res);  // (2)
        return res;
    }
}

?? 注:后序遍历的另一种解法。前序中左右=>先压左子变成中右左=>翻转左中右。这个解法对于求N叉树也适用。

 1 class Solution {
 2     public List<Integer> postorderTraversal(TreeNode root) {
 3         Stack<TreeNode> stack = new Stack<>();
 4         List<Integer> res = new ArrayList<>();
 5         postOrder(root, res);
 6         return res;
 7     }
 8     public void postOrder(TreeNode node, List<Integer> res){
 9         if(node==null){
10             return;
11         }
12         postOrder(node.left, res);
13         postOrder(node.right, res);
14         res.add(node.val);
15     }
16 }

102. 二叉树的层次遍历 ??

 1 class Solution {
 2     public List<List<Integer>> levelOrder(TreeNode root) {
 3         List<List<Integer>> res = new ArrayList<List<Integer>>();
 4         if(root==null){
 5             return res;
 6         }
 7         Queue<TreeNode> queue = new LinkedList<>(); // 注意queue的定义
 8         List<Integer> curList = new ArrayList<>();
 9         TreeNode cur = root;
10         queue.offer(root);
11         queue.offer(null);
12         while(!queue.isEmpty()){
13             cur = queue.poll();
14             if(cur!=null){
15                 curList.add(cur.val);
16                 if(cur.left!=null){
17                     queue.offer(cur.left);
18                 }
19                 if(cur.right!=null){
20                     queue.offer(cur.right);
21                 }
22             }else if(cur==null){
23                 res.add(curList);
24                 curList = new ArrayList<>();
25                 if(!queue.isEmpty()){   // 注意怎么结束,以及不要丢解
26                      queue.offer(null);
27                 }
28             }
29         }
30         return res;
31     }
32 }

107. 二叉树的层次遍历 II

1 LinkedList<List<Integer>> res = new LinkedList<>();
2 res.addFirst(curList);
3 //投机取巧

637. 二叉树的层平均值

 1 class Solution {
 2     public List<Double> averageOfLevels(TreeNode root) {
 3         List<Double> res = new ArrayList<>();
 4         if(root==null){
 5             return res;
 6         }
 7         Queue<TreeNode> queue = new LinkedList<>(); // 注意queue的定义
 8         double curSum = 0.0;
 9         int curSize = 0;
10         TreeNode cur = root;
11         queue.offer(root);
12         queue.offer(null);
13         while(!queue.isEmpty()){
14             cur = queue.poll();
15             if(cur!=null){
16                 curSum+=cur.val;
17                 curSize++;
18                 if(cur.left!=null){
19                     queue.offer(cur.left);
20                 }
21                 if(cur.right!=null){
22                     queue.offer(cur.right);
23                 }
24             }else if(cur==null){
25                 res.add(curSum/curSize);
26                 curSum=0.0;
27                 curSize=0;
28                 if(!queue.isEmpty()){   // 注意怎么结束,以及不要丢解
29                      queue.offer(null);
30                 }
31             }
32         }
33         return res;
34     }
35 }

103. 二叉树的锯齿形层次遍历

 1 class Solution {
 2     public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
 3         List<List<Integer>> res = new ArrayList<List<Integer>>();
 4         if(root==null){
 5             return res;
 6         }
 7         Queue<TreeNode> queue = new LinkedList<>(); // 注意queue的定义
 8         List<Integer> curList = new ArrayList<>();
 9         TreeNode cur = root;
10         queue.offer(root);
11         queue.offer(null);
12         int flag = 0;
13         while(!queue.isEmpty()){
14             cur = queue.poll();
15             if(cur!=null){
16                 if(flag%2==0){
17                     curList.add(cur.val);
18                 }else{
19                     curList.add(0, cur.val);
20                 }
21                 if(cur.left!=null){
22                     queue.offer(cur.left);
23                 }
24                 if(cur.right!=null){
25                     queue.offer(cur.right);
26                 }
27             }else if(cur==null){
28                 res.add(curList);
29                 curList = new ArrayList<>();
30                 flag++;
31                 if(!queue.isEmpty()){   // 注意怎么结束,以及不要丢解
32                      queue.offer(null);
33                 }
34             }
35         }
36         return res;
37     }
38 }

429. N叉树的层序遍历

 1 class Solution {
 2     public List<List<Integer>> levelOrder(Node root) {
 3       List<List<Integer>> res = new ArrayList<List<Integer>>();
 4         if(root==null){
 5             return res;
 6         }
 7         Queue<Node> queue = new LinkedList<>();
 8         List<Integer> curList = new ArrayList<>();
 9         Node cur = root;
10         queue.offer(root);
11         queue.offer(null);
12         while(!queue.isEmpty()){
13             cur = queue.poll();
14             if(cur!=null){
15                 curList.add(cur.val);
16                 for(Node child : cur.children){   // 就差在这了
17                     queue.offer(child);
18                 }
19             }else if(cur==null){
20                 res.add(curList);
21                 curList = new ArrayList<>();
22                 if(!queue.isEmpty()){
23                      queue.offer(null);
24                 }
25             }
26         }
27         return res;
28     }
29 }

993. 二叉树的堂兄弟节点

最开始用层次遍历解的,但是忽略了不能是亲兄弟!DFS!

原文地址:https://www.cnblogs.com/naonaoling/p/11791842.html

时间: 2024-11-08 15:38:02

二叉树的遍历-迭代&递归的相关文章

101. 对称二叉树,c++迭代递归解法

101. 对称二叉树,c++迭代递归解法 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树?[1,2,2,3,4,4,3] 是对称的. 1 / 2 2 / \ / 3 4 4 3 但是下面这个?[1,2,2,null,3,null,3] 则不是镜像对称的: 1 / 2 2 \ 3 3 这道题可以用迭代和递归两种方法求解 迭代法代码如下,主要思想是,将树的左右分支放入两个队列中.因为题目是判断两个数是否对称,所以在将节点a的孩子放左队列时,先放a的右子结点,再放a的左子结点:在将节点b的孩子

二叉树的遍历--非递归实现

leetcode中有这么一道题,非递归来实现二叉树的遍历. 二叉树的后序遍历顺序为,root->left, root->right, root,因此需要保存根节点的状态.显然使用栈来模拟递归的过程,但是难点是怎么从root->right转换到root. 方法1: 对于节点p可以分情况讨论 1. p如果是叶子节点,直接输出 2. p如果有孩子,且孩子没有被访问过,则按照右孩子,左孩子的顺序依次入栈 3. p如果有孩子,而且孩子都已经访问过,则访问p节点 如何来表示出p的孩是否都已经访问过了

【数据结构与算法】二叉树深度遍历(递归)

二叉树的深度遍历用递归的话就没有什么好说的了. 代码实现 /** * 源码名称:TreeIteratorRecursion.java * 日期:2014-08-23 * 程序功能:二叉树深度遍历 * 版权:[email protected] * 作者:A2BGeek */ public class TreeIteratorRecursion { class TreeNode<T> { private T mNodeData; private TreeNode<T> mLeftChi

二叉树的遍历(递归和非递归两种方法)

二叉树的遍历 1.二叉树的定义 (1)C语言版 typedef struct BiNode { ElemType val; struct BiNode *left,*right; }BiNode,*BiTreee; (2)C++版 struct TreeNode { ElemType val; TreeNode *left; TreeNode *right; }; 我们可以看到这两种定义的格式是不一样的,自己以前一直是在C++程序中用C语言版的定义.网上不同人采用的也不一样,最终在写二叉树的相关

二叉树的遍历(非递归)

1 //二叉树的先序遍历(非递归) 2 public void PreOrderTraverse() 3 { 4 BiTNode p = this.root; 5 Stack stack = new Stack(10000); 6 7 while(!stack.isEmpty || p != null) 8 if(p != null) 9 { 10 if(p.rchild != null) 11 stack.push(p.rchild); 12 System.out.print(p.data +

二叉树的遍历(递归、非递归)

1 public class BinTree { 2 private char date; 3 private BinTree lchild; 4 private BinTree rchild; 5 6 public BinTree(char c) { 7 date = c; 8 } 9 10 // 先序遍历递归 11 public static void preOrder(BinTree t) { 12 if (t == null) { 13 return; 14 } 15 System.ou

二叉树的遍历,递归和非递归

import java.util.ArrayDeque; import java.util.Stack; class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode(int val) { this.val = val; } } public class BinaryTree { //先序遍历递归 public static void preOrder(TreeNode

二叉树前序遍历非递归写法

前序遍历非递归依靠栈实现,相对来说比较简单,先来用手写模拟一下基本就能知道怎么写了 据此可得如下代码 void preOrder_stack(BiTree T){ printf("\n非递归先序遍历结果:\n"); initStack(&sqStack); BiTree p=T; push(&sqStack,p); while(!stackEmpty(sqStack)){ pop(&sqStack,&p); printf("%d ",

【Tree】二叉树先序遍历 迭代 &amp; 递归

1 /*************************** 2 https://leetcode.com/problems/binary-tree-preorder-traversal/ 3 @date 2015.5.13 4 @description 5 用非递归方法对二叉树进行先序遍历 6 借助辅助栈 7 每次先访问根节点,把节点压入栈,再转向其左孩子,直至左子树的左孩子为空,依次将栈顶元素出栈,转向右孩子. 8 9 10 ****************************/ 11