二叉树的基本操作

目录

一、二叉树的前序遍历

二、二叉树的中序遍历

三、二叉树的后序遍历

四、二叉树的层序遍历

五、求结点个数

六、求叶子结点个数

七、求第k层结点个数

八、获取二叉树的高度

九、查找val所在的结点


一、二叉树的前序遍历

前序:先遍历根结点——>左结点——>右结点

思路:①先建立链表存放要打印的结点

           ②如果根节点为空,返回

           ③如果根结点不为空,递归遍历

代码实现:

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root==null) return list;
            list.add(root.val);
            list.addAll(preorderTraversal(root.left));
            list.addAll(preorderTraversal(root.right));
            return list;
    }
}

二、二叉树的中序遍历

中序:先遍历左结点——>根结点——>右结点

思路:

①先建立链表存放要打印的结点

②如果根节点为空,返回

③如果根结点不为空,递归遍历

代码实现:

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root==null) return list;
            list.addAll(inorderTraversal(root.left));
            list.add(root.val);
            list.addAll(inorderTraversal(root.right));
        
        return list;

    }
}

三、二叉树的后序遍历

中序:先遍历左结点——>右结点——>根结点

思路:

①先建立链表存放要打印的结点

②如果根节点为空,返回

③如果根结点不为空,递归遍历

代码实现:

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root==null) return list;
            list.addAll(inorderTraversal(root.left));
            list.addAll(inorderTraversal(root.right));
            list.add(root.val);
            return list;

    }
}

四、二叉树的层序遍历

层序:一层一层的遍历

思路:“二维数组思路来实现”  代码片段注释上有

代码实现:

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        //创建二维数组
        List<List<Integer>> ret = new ArrayList<>();
        //判断根结点是否为空
        if(root==null) return ret;
        //创建一个队列
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);

        //当队列不为空的时候循环
        while(!queue.isEmpty()){
            //创建每一层的链表
            List<Integer> list = new ArrayList<>();
            
            int size = queue.size();
            while(size>0){
                TreeNode cur =queue.poll();
                list.add(cur.val);
                if(cur.left!=null){
                    queue.offer(cur.left);
                }
                if(cur.right!=null){
                    queue.offer(cur.right);
                }
                size--;
            }
             ret.add(list);
        }
        return ret;
    }
}

五、求结点个数

1、遍历思路

static int size = 0;

    void getSize1(BTNode root) {
        if (root != null) {
            size++;
            getSize1(root.left);
            getSize1(root.right);
        }

    }

2、大问题化小问题思路

   左子树+右子树+1

int  getSize2(BTNode root) {
        int size=0;
        if (root != null) {
            size++;
            size= getSize2(root.left) + getSize2(root.right) + 1;
        }
            return size;
    }

六、求叶子结点个数

1、遍历思路

static int leafSize = 0;
    void getLeafSize1(BTNode root) {
        if (root==null){
            return;
        }
        if (root.right==null&&root.left==null){
            leafSize++;
        }
        getLeafSize1(root.left);
        getLeafSize1(root.right);
    }

2、子问题思路

int getLeafSize2(BTNode root) {
        int leafSize = 0;
        if (root==null){
            return 0;
        }
        if (root.right==null&&root.left==null){
            leafSize++;
        }
         return getLeafSize2(root.left)+  getLeafSize2(root.right);
    }

七、求第k层结点个数

int getKLevelSize(BTNode root,int k){
        if (root==null){
            return 0;
        }
      if (k==1){
          return 1;
      }
        return getKLevelSize(root.left,k-1)+  getKLevelSize(root.right,k-1);
    }

八、获取二叉树的高度

class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null) return 0;
        int leftHight = maxDepth(root.left);
        int rightHight = maxDepth(root.right);
        return (leftHight>rightHight)?leftHight+1:rightHight+1;
    }
}

九、查找val所在的结点

TNode find(BTNode root, char val) {
        if (root==null) return null;
        if (root.val==val){
            return root;
    }
         BTNode ret1=find(root.left,val);
        if (ret1!=null){//在左子树中
            return ret1;
        }
         BTNode ret2=find(root.right,val);
        if (ret2!=null){//在右子树中
            return ret2;
        }
        return null;//没有找到
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值