欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二叉树遍历汇总

程序员文章站 2022-06-17 19:48:16
...

二叉树的层序遍历

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
二叉树遍历汇总

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
//BFS:广度优先搜索
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();//用队列来操作
		if(root==null) {
			return new ArrayList<>();//因为返回值类型是List
		}
		//第一层:根节点入队列
		queue.add(root);

		List<List<Integer>> res = new ArrayList<>();//存放所有层数据

		while(!queue.isEmpty()){
			int level = queue.size();//这一层的结点数,用于判断该层是否循环结束
			List<Integer> list = new ArrayList<>();//用于存放当前层数据

			for(int i=0;i<level;i++){//遍历这一层
				TreeNode cur = queue.poll();//出队列,并作为父结点,也是当前层数据
				list.add(cur.val);//将当前层数据放进去
				//下一层的数据入队列,作为下一层循环新的父结点
				if(cur.left!=null){
					queue.add(cur.left);//如果左孩子不为空,就放入队列中
				}
				if(cur.right!=null){
					queue.add(cur.right);
				}
			}
			res.add(list);//当前层结束后,将当前层放入List,重新开始for循环
		}
		return res;
    }
}

总结:
1.用LinkedList来构建队列queue,用于辅助操作,每次入队一层,先将根结点入队;
2.构建ArrayList存放所有层的数据;
3.构建ArrayList存放一层的数据;
4.将队列中的队首出队,作为父结点

二叉树遍历汇总
1.先将1入队,再出队列,放入list;【1】
2.将1的左右孩子入队,for循环结束,将当前层list入所有层的res中;【2 3】
3.计算到level=2,开始新的for循环,将先入队的的2出队,放入list,并作为父结点,将2的左右孩子入队;【3 4 5】
4.将3出队,并放入list,并作为父结点,将3的左右孩子入队,当前层for循环结束;【4 5 6】
5.level=3,将4出队,放入list,将4的孩子7入队;【5 6 7】
6.将5出队,判断没有孩子结点,继续循环,6,7也出队,进入list中

二叉树的中序遍历

给定一个二叉树,返回它的中序遍历
二叉树遍历汇总

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        TreeNode curr = root;
        while(curr != null || !stack.isEmpty()){
            //将左子树逐个入栈
            if(curr != null){
                stack.push(curr);
                curr = curr.left;
            }else{//即到达了树的最底层之下,curr=null
                curr = stack.pop();//栈顶的即为中序遍历第一个节点
                //stack.pop();//因为pop()没有返回值
                list.add(curr.val);//节点数值直接入队列
                curr = curr.right;//若还未到达父结点,则curr.right=null,继续入队列
            }
        }
        return list;
    }
}
相关标签: 数据结构