一文图解二叉树面试题

本文详细介绍了树与二叉树的概念,包括根节点、父节点和子节点,以及二叉树的特性。接着,重点讲解了二叉搜索树(BST),它的特点是每个节点的左子树所有节点小于该节点,右子树所有节点大于该节点。此外,还阐述了如何判断二叉树的最大深度、最小深度以及是否为平衡二叉树。最后,通过示例代码展示了二叉搜索树的插入、查找和删除操作,并讨论了这些操作的逻辑。
摘要由CSDN通过智能技术生成

一、树 & 二叉树

树是由节点和边构成,储存元素的集合。节点分根节点、父节点和子节点的概念。

如图:树深=4; 5是根节点;同样8与3的关系是父子节点关系。

二叉树binary tree,则加了“二叉”(binary),意思是在树中作区分。每个节点至多有两个子(child),left child & right child。二叉树在很多例子中使用,比如二叉树表示算术表达式。

如图:1/8是左节点;2/3是右节点;

二、二叉搜索树 BST

顾名思义,二叉树上又加了个搜索的限制。其要求:每个节点比其左子树元素大,比其右子树元素小。

如图:每个节点比它左子树的任意节点大,而且比它右子树的任意节点小

面试点一:理解 TreeNode 数据结构

节点数据结构,即节点分左节点和右节点及本身节点值。如图

面试点二:如何确定二叉树的最大深度或者最小深度

答案:简单的递归实现即可,代码如下:

int maxDeath(TreeNode node){ if(node==null){ return 0; } int left = maxDeath(node.left); int right = maxDeath(node.right); return Math.max(left,right) + 1; } int getMinDepth(TreeNode root){ if(root == null){ return 0; } return getMin(root); } int getMin(TreeNode root){ if(root == null){ return Integer.MAX_VALUE; } if(root.left == null&&root.right == null){ return 1; } return Math.min(getMin(root.left),getMin(root.right)) + 1; }

面试点三:如何确定二叉树是否是平衡二叉树

答案:简单的递归实现即可,代码如下:

boolean isBalanced(TreeNode node){ return maxDeath2(node)!=-1; } int maxDeath2(TreeNode node){ if(node == null){ return 0; } int left = maxDeath2(node.left); int right = maxDeath2(node.right); if(left==-1||right==-1||Math.abs(left-right)>1){ return -1; } return Math.max(left, right) + 1; }

前面面试点是 二叉树 的,后面面试点是 搜索二叉树 的。先运行搜搜二叉树代码:

public class BinarySearchTreeTest { public static void main(String[] args) { BinarySearchTree b = new BinarySearchTree(); b.insert(3);b.insert(8);b.insert(1);b.insert(4);b.insert(6); b.insert(2);b.insert(10);b.insert(9);b.insert(20);b.insert(25); // 打印二叉树 b.toString(b.root); System.out.println(); // 是否存在节点值10 TreeNode node01 = b.search(10); System.out.println("是否存在节点值为10 => " + node01.value); // 是否存在节点值11 TreeNode node02 = b.search(11); System.out.println("是否存在节点值为11 => " + node02); // 删除节点8 TreeNode node03 = b.delete(8); System.out.println("删除节点8 => " + node03.value); b.toString(b.root); } }

结果如下:

value = 1 -> value = 2 -> value = 3 -> value = 4 -> value = 6 -> value = 8 -> value = 9 -> value = 10 -> value = 20 -> value = 25 -> 是否存在节点值为10 => 10 是否存在节点值为11 => null 删除节点8 => 8 value = 1 -> value = 2 -> value = 3 -> value = 4 -> value = 6 -> value = 9 -> value = 10 -> value = 20 -> value = 25 ->

面试点四:搜索二叉树如何实现插入

插入,和删除一样会引起二叉搜索树的动态变化。插入相对删处理逻辑相对简单些。如图插入的逻辑:

  1. 从root节点开始

  2. 如果root为空,root为插入值

  3. 循环:

  4. 如果当前节点值大于插入值,找左节点

  5. 如果当前节点值小于插入值,找右节点

面试点五:搜索二叉树如何实现查找

其算法复杂度 : O(lgN),树深(N)。如图查找逻辑:

  1. 从root节点开始

  2. 比当前节点值小,则找其左节点

  3. 比当前节点值大,则找其右节点

  4. 与当前节点值相等,查找到返回TRUE

  5. 查找完毕未找到

面试点五:搜索二叉树如何实现删除

比较复杂了。首先找到删除节点,其寻找方法:删除节点的后继者是在其右节点树种最小的节点。如图删除对应逻辑:

结果为:

  1. 找到删除节点

  2. 如果删除节点左节点为空 , 右节点也为空

  3. 如果删除节点只有一个子节点 右节点 或者 左节点

  4. 如果删除节点左右子节点都不为空

三、小结

就像码出高效面试的程序媛偶尔吃一碗“老坛酸菜牛肉面”一样的味道,品味一个算法,比如 BST 的时候,总是那种说不出的味道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值