LeetCode刷题day15|102二叉树的层序遍历、226翻转二叉树、101对称二叉树

一、102二叉树的层序遍历

有三个需要注意的点:

  1. 对根节点非空判断。空节点入队!
	if (root != null)
            deque.add(root);
  1. 对每一层的节点数(即下一层开始时队列的大小)进行存储。
	int size = deque.size();        //每一层的节点数
    List<Integer> tmp = new ArrayList<>();      //每一层节点遍历后存储的list数组

    while ((size--) != 0) {         //当遍历完该层节点跳出循环      
  1. 需要判断节点的左右孩子是否为空。依旧遵循着空节点不入队的原则。
				//需要判断左右子树是否为空,空节点不进队列
                if(node.left!=null) deque.add(node.left);
                if(node.right!=null) deque.add(node.right);    

以下是完整代码部分:

	public List<List<Integer>> levelOrder(TreeNode root) {

        List<List<Integer>> res = new ArrayList<>();
        Deque<TreeNode> deque = new LinkedList();

        if (root != null)
            deque.add(root);

        while (!deque.isEmpty()) {

            int size = deque.size();        //每一层的节点数
            List<Integer> tmp = new ArrayList<>();      //每一层节点遍历后存储的list数组

            while ((size--) != 0) {         //当遍历完该层节点跳出循环

                TreeNode node = deque.remove();
                tmp.add(node.val);

                //需要判断左右子树是否为空,空节点不进队列
                if(node.left!=null) deque.add(node.left);
                if(node.right!=null) deque.add(node.right);
            }
            res.add(tmp);
        }
        return res;
    }     

二、226翻转二叉树

这道题我是在后序遍历的基础上将处理节点的那行代码修改成交换左右孩子
以下是代码部分:

	public TreeNode invertTree(TreeNode root) {

        preorder(root);
        return root;

    }

    private void preorder(TreeNode node){

        if(node == null)
            return;

        preorder(node.left);
        preorder(node.right);

        //调换顺序
        TreeNode tmp = node.left;
        node.left = node.right;
        node.right = tmp;

    }    

当然,这道题也可以使用前序遍历和中序遍历,其中中序遍历在完成交换左右孩子后,再访问一次左子树(即没交换以前的右子树)
同时,代码可以直接以给的方法作为递归函数 ,此时就不需要再额外定义一个用于递归的方法。
以下是代码部分:

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (root == NULL) return root;
        invertTree(root->left);         // 左
        swap(root->left, root->right);  // 中
        invertTree(root->left);         // 注意 这里依然要遍历左孩子,因为中间节点已经翻转了
        return root;
    }
}; 

三、101对称二叉树

这道题学习到的知识:

  1. 通过再参数中存放两个节点,可以同时遍历以这两个节点为根节点的子树。
  2. 终止条件不一定只有一个,可以有很多个。
  3. 对于对称的比较,分别比较外侧和内测是否都相等。

以下是代码部分:

public class 对称二叉树101 {

    public boolean isSymmetric(TreeNode root) {

        return commapre(root.left,root.right);
    }

    private boolean commapre(TreeNode left,TreeNode right){

        //终止条件。
        if(left!=null && right==null)
            return false;
        else if(left==null && right!=null)
            return false;
        else if(left==null && right==null)
            return true;
        //此时,只剩下node左节点与右节点都不为null的情况
        else if(left.val !=right.val)
            return false;
        else {

            //同时遍历两棵树,必须使用后序遍历
            boolean out = commapre(left.left,right.right);
            boolean in = commapre(left.right,right.left);
            return out && in;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值