《恋上数据结构第1季,kafka入门与实践电子版

*   最多有 2h − 1 个节点( 20 + 21 + 22 + ⋯ + 2h−1,即 **满二叉树** )

*   总节点数量为 n  

    2h−1 ≤ n < 2h  

    h − 1 ≤ log2n < h  

    h = floor( log2n ) + 1  

    ( `floor` 是向下取整,`ceiling` 是向上取整 )

在这里插入图片描述

在这里插入图片描述

下图不是完全二叉树

在这里插入图片描述

[](

)面试题(完全二叉树)


在这里插入图片描述

国外教材的说法:了解一下

在这里插入图片描述

[](

)二叉树的遍历 + 练习题

===============================================================================

遍历是数据结构中的常见操作:把所有元素都访问一遍;

线性数据结构的遍历比较简单:

  • 正序遍历

  • 逆序遍历

根据节点访问顺序的不同,二叉树的常见遍历方式有 4 种:

  • 前序遍历(Preorder Traversal)

  • 中序遍历(Inorder Traversal)

  • 后序遍历(Postorder Traversal)

  • 层序遍历(Level Order Traversal)

遍历的应用

  • 前序遍历:树状结构展示(注意左右子树的顺序)

  • 中序遍历:二叉搜索树的中序遍历按升序或者降序处理节点

  • 后序遍历:适用于一些先子后父的操作

  • 层序遍历:计算二叉树的高度、判断一棵树是否为完全二叉树

[](

)前序遍历(Preorder Traversal)


访问顺序:节点、前序遍历子树、前序遍历子树

下图前序遍历的结果是:7、4、2、1、3、5、9、8、11、10、12

在这里插入图片描述

二叉树的前序遍历:[https://leetcode-cn.com/problems/binary-tree-preorder-traversal/](

)


/**

 * Definition for a binary tree node.

 * public class TreeNode {

 *     int val;

 *     TreeNode left;

 *     TreeNode right;

 *     TreeNode(int x) { val = x; }

 * }

 */

class Solution {

	List<Integer> list = new ArrayList<>();

	public List<Integer> preorderTraversal(TreeNode root) {

        if(root == null) return list;

        

        list.add(root.val);

        preorderTraversal(root.left);

        preorderTraversal(root.right);

        

        return list;

    }

} 

[](

)中序遍历(Inorder Traversal)


访问顺序:中序遍历子树、节点、中序遍历子树

下图中序遍历的结果是:1、2、3、4、5、7、8、9、10、11、12

另一种中序遍历访问顺序:中序遍历子树、节点、中序遍历子树

则下图的中序遍历的结果是:12、11、10、9、8 、7、5、4、3、2、1

在这里插入图片描述

二叉搜索树的中序遍历结果是升序或者降序的

二叉树的中序遍历: [https://leetcode-cn.com/problems/binary-tree-inorder-traversal/](

)


/**

 * Definition for a binary tree node.

 * public class TreeNode {

 *     int val;

 *     TreeNode left;

 *     TreeNode right;

 *     TreeNode(int x) { val = x; }

 * }

 */

class Solution {

	List<Integer> list = new ArrayList<>();

    public List<Integer> inorderTraversal(TreeNode root) {

    	if(root == null) return list;

    	inorderTraversal(root.left);

    	list.add(root.val);

    	inorderTraversal(root.right);

    	return list;

    }

} 

[](

)后序遍历(Postorder Traversal)


访问顺序:后序遍历子树、后序遍历子树、节点

下图的后序遍历的结果是:1、3、2、5、4、8、10、12、11、9、7

在这里插入图片描述

二叉树的后序遍历: [https://leetcode-cn.com/problems/binary-tree-postorder-traversal/](

)


/**

 * Definition for a binary tree node.

 * public class TreeNode {

 *     int val;

 *     TreeNode left;

 *     TreeNode right;

 *     TreeNode(int x) { val = x; }

 * }

 */

class Solution {

	List<Integer> list = new ArrayList<Integer>();

    public List<Integer> postorderTraversal(TreeNode root) {

        if(root == null) return list;

        postorderTraversal(root.left);

        postorderTraversal(root.right);

        list.add(root.val);

        return list;

    }

} 

[](

)层序遍历(Level Order Traversal)


访问顺序:从上到下、从左到右依次访问每一个节点

下图的层序遍历的结果是:7、4、9、2、5、8、11、1、3、10、12

在这里插入图片描述

二叉树的层次遍历: [https://leetcode-cn.com/problems/binary-tree-level-order-traversal/](

)


/**

 * Definition for a binary tree node.

 * public class TreeNode {

 *     int val;

 *     TreeNode left;

 *     TreeNode right;

 *     TreeNode(int x) { val = x; }

 * }

 */

class Solution {

	List<List<Integer>> resList = new ArrayList<>();

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

    	if(root == null) return resList;

    	

    	Queue<TreeNode> queue = new LinkedList<>();

    	int levelSize = 1;

    	queue.offer(root);

    

    	

    	List<Integer> list = new ArrayList<>(); ;

    	while(!queue.isEmpty()){

    		TreeNode node = queue.poll();

    		list.add(node.val);

    		levelSize--;

    		

    		if(node.left != null){

    			queue.offer(node.left);

    		}

    		if(node.right != null){

    			queue.offer(node.right);

    		}



    		if(levelSize == 0){

    			resList.add(list);

                levelSize = queue.size();

    			list = new ArrayList<>();

    		}

    	}

    	return resList;

    }

} 

[](

)根据遍历结果重构二叉树

==============================================================================

以下结果可以保证重构出唯一的一棵二叉树:

  • 前序遍历 + 序遍历

  • 后序遍历 + 序遍历

前序遍历 + 后序遍历:

  • 如果它是一棵真二叉树(Proper Binary Tree),结果是唯一的

  • 不然结果不唯一

[](

)前序遍历+中序遍历 重构二叉树


在这里插入图片描述

[](

)四则运算

=======================================================================

四则运算的表达式可以分为3种:

  • 前缀表达式(prefix expression),又称为波兰表达式

总结

这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!

某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!

成功只会留给那些有准备的人!

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](

)**

_FFFFFF,t_70)

[](

)四则运算

=======================================================================

四则运算的表达式可以分为3种:

  • 前缀表达式(prefix expression),又称为波兰表达式

总结

这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!

某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!

成功只会留给那些有准备的人!

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](

)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值