mybloger

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

二叉搜索树

1.前言

各种算法层出不穷,又彼此联系,在如此纷繁复杂的算法学习路上,哪里是尽头。在我看来,纠结此类抽象问题,一定得使用抽象思维去破解,去找到问题的源头,也就是常说的框架。框架就是方向,方向对了,你总可以把题目搞出来。数据结构一共就两种框架,数组和链表。「树」,⽤数组实现就是「堆」,因为「堆」是⼀个完全⼆叉树,⽤数组存储不需要节点指针,操作也⽐较简单;⽤链表实现就是很常⻅的那种 「树」,因为不⼀定是完全⼆叉树,所以不适合⽤数组存储。为此,在这种 链表「树」结构之上,⼜衍⽣出各种巧妙的设计,⽐如⼆叉搜索树、AVL 树、红⿊树、区间树、B 树等等,以应对不同的问题。不废话了,今天就水一篇二叉搜索树。

2.模板

二叉树结构

class BTree {
   int val;
   BTree left;
   BTree right;
   public BTree(int val){this.val = val;}
}

构建,基于链表,可以看我另外一篇数据结构-链表。

遍历 (BFS + DFS)

BFS例题:

题目:之字型遍历二叉树:

请实现一个函数按照之字形顺序从上向下打印二叉树。

即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

输入如下图所示二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]
  8
  / \
12 2
    / \
  6   4
输出:[[8], [2, 12], [6, 4]]

实现:

class Solution {
   public List<List<Integer>> printFromTopToBottom(TreeNode root) {
      List<List<Integer>> list = new ArrayList();
       
       boolean tag = true;
       LinkedList<TreeNode> q = new LinkedList();
       if (root == null) {
           return list;
      }
       q.add(root);
       while (q.size() > 0) {
           int size = q.size();
           List<Integer> temp = new ArrayList<>();
           while (size-- > 0) {
               TreeNode h = q.poll();
               if(tag) {
                   temp.add(h.val);
              }else {
                   temp.add(0,h.val);
              }
               if (h.left != null) q.add(h.left);
               if (h.right != null) q.add(h.right);
          }
           list.add(temp);
           tag = !tag;
      }
          return list;  
  }
}
BFS模板
while(!q.isEmpty()) {
取出对头
操作
入队
}

DFS

输入一棵二叉树的根结点,求该树的深度。

从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

输入:二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]如下图所示:
  8
  / \
12 2
    / \
  6   4

输出:3
class Solution {
  public int treeDepth(TreeNode root) {
      if (root == null) return 0;
      return Math.max(treeDepth(root.left),treeDepth(root.right)) + 1;
  }
}

 

3.使用

需要一层一层的模拟,使用bfs,若只需要得到某个最值或是某一个节点dfs

 

 

 

posted on 2022-04-25 13:27  万能包哥  阅读(84)  评论(0编辑  收藏  举报