有关二叉树 的基本操作

本文介绍了二叉树的各种基本操作,包括前中后序遍历、计算节点个数、叶子节点数量、获取指定层级节点数、计算树的高度以及查找特定值的节点。同时,提供了判断一棵树是否为完全二叉树的方法。这些操作通过递归和迭代两种方式实现,对于理解和处理二叉树问题具有指导意义。
摘要由CSDN通过智能技术生成

二叉树第二部分

在这里插入图片描述
这一部分 完成 一些有关二叉树 的基本操作

// 前序遍历
void preOrderTraversal(Node root);

// 中序遍历
void inOrderTraversal(Node root);

// 后序遍历
void postOrderTraversal(Node root);

// 遍历思路-求结点个数
static int size = 0;
void getSize1(Node root);

// 子问题思路-求结点个数
int getSize2(Node root);

// 遍历思路-求叶子结点个数
static int leafSize = 0;
void getLeafSize1(Node root);

// 子问题思路-求叶子结点个数
int getLeafSize2(Node root);

// 子问题思路-求第 k 层结点个数
int getKLevelSize(Node root);

// 获取二叉树的高度
int getHeight(Node root);

// 查找 val 所在结点,没有找到返回 null
// 按照 根 -> 左子树 -> 右子树的顺序进行查找
// 一旦找到,立即返回,不需要继续在其他位置查找
Node find(Node root, int val);

这里前中后续遍历 上文 已经完成.

1.求结点个数

1.遍历思路

  //遍历思路
     int size = 0;
    void getSize1(TreeNode root) {
        if(root == null) {
            return;
        }
        size++;
        getSize1(root.left);
        getSize1(root.right);
    }

在这里插入图片描述

2.子问题思路

   //子问题思路
    int getSize2(TreeNode root) {
        if(root == null) {
            return 0;
        }
        return getSize2(root.left) + getSize2(root.right) + 1;
    }

在这里插入图片描述

2.求叶子结点个数

1.遍历思路

 // 遍历思路-求叶子结点个数
     int leafSize = 0;
    void getLeafSize1(TreeNode root) {
        if(root == null) {
            return;
        }
        if(root.left == null && root.right == null) {
            leafSize++;
        }
        getLeafSize1(root.left);
        getLeafSize1(root.right);
  }

在这里插入图片描述

2.子问题思路

  // 子问题思路-求叶子结点个数
    int getLeafSize2(TreeNode root) {
        if(root == null) {
            return 0;
        }
        if(root.left == null && root.right == null) {
            // 当前 的 root 为 叶子节点
            return 1;
        }
        return getLeafSize2(root.left) + getLeafSize2(root.right);

    }

在这里插入图片描述

3求第k层结点个数

这里直接来看子问题思路

子问题思路-求第 k 层结点个数

  // 子问题思路-求第 k 层结点个数
    int getKLevelSize(TreeNode root,int k) {
            if(root == null || k < 0) {
                return 0;
            }
            if(k == 1) {
                return 1;
            }
            return getKLevelSize(root.left,k - 1) + getKLevelSize(root.right,k-1);
    }

在这里插入图片描述

4.获取二叉树的高度

 int getHeight(TreeNode root) {
        return root == null?0:Math.max(getHeight(root.left)+1,getHeight(root.right)+1);
    }

在这里插入图片描述
在这里插入图片描述

上面的看不懂 也可以看这种 一个 思路递归下来
int getHeight2(TreeNode root) {
        if(root == null) {
            return 0;
        }
        int leftHeight = getHeight(root.left);
        int rightHeight = getHeight(root.right);
        return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
    }

二叉树的最大深度 上面的oj题

#

5.查找二叉树中是否存在val

TreeNode find(TreeNode root, char val) {
        if(root == null) return null;
        if(root.val == val) {
            return root;
        }
//        TreeNode top = find(root.left,val);
//            if(top != null) {
//                return top;
//            }
//            TreeNode top2 = find(root.right,val);
//            if(top2 != null ) {
//                return top2;
//            }
//            return null;
        //这里可以简写成这样
        return find(root.right,val);
    }

这里 也没啥 难度 只需要 知道两个 边界条件就ok 那就是 root == null 和 root.val == val 然后 去 递归左子树 和 右子树 ,判断

root.val 是否等于 val 即可

注意 这里 我们使用 这个方法是 主函数 中要 使用try 和 catch

因为 没有查找的val 会返回 null此时 使用 会发生空指针异常

   try{
                 TreeNode treeNode1 =  binaryTree.find(treeNode,'A');
                 System.out.println(treeNode1.val);
             }catch(NullPointerException e) {
                 e.printStackTrace();
                 System.out.println("捕获到空指针异常");
             }

6. 判断一课树 是否是完全二叉树

在这里插入图片描述

boolean isCompleteTree(TreeNode root){
        if(root == null) {
            return true;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()) {
            TreeNode top = queue.poll();
            if(top != null) {
                queue.offer(root.left);
                queue.offer(root.right);
            }else {
                break;
            }
        }
          while(!queue.isEmpty()) {
                TreeNode top2 = queue.peek();
                if(top2 != null) {
                    return false;
                }
                queue.poll();
            }
        return true;
    }

在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值