开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情
树
树就是一个类似现实树倒置的结构,
- 一棵树中的任意两个结点有且仅有唯一的一条路径连通。
- 一棵树如果有 n 个结点,那么它一定恰好有 n-1 条边。
- 一棵树不包含回路。
二叉树:是每个节点最多只有两个分支(即不存在分支度大于 2 的节点)的树结构
二叉树的代码实现:
class Node<V> {
int val;
Node left;
Node right;
public Node(int v) {
val = v;
}
}
二叉树 的第 i 层至多拥有 2^(i-1)
个节点,深度为 k 的二叉树至多总共有 2^(k+1)-1
个节点(满二叉树的情况),至少有 2^(k) 个节点。
二叉树有
- 满二叉树,就是如果一个二叉树的层数为 K,且结点总数是(2^k)
- 完全二叉树,就是除最后一层,其他都是满的,并且最后一层可以是满的,并且最后一层严格按照先左后右的子树顺序排列
- 平衡二叉树:可以是空树,或者左右子树高度相差1。平衡二叉树的常用实现方法有 红黑树、AVL 树、替罪羊树、加权平衡树、伸展树
怎么使用代码判断是不是满二叉树
先定义一个返回类,里面有树的高度和结点个数信息。然后对数进行遍历,找到左子树和右子树的最大高度,然后得到总的结点数,最后利用公式判断
判断完全二叉树 声明一个list,然后按照根左右的书写,把它添加到list里面,声明一个标记,当遇到有右子树,没有左子树的标记,然后返回false
判断平衡二叉树
声明一个返回类,拿到是不是平衡和高度的数据。用左右子树递归调用方法,得到左右高度差。进行平衡判断
二叉树的非递归遍历
不用递归的遍历,我们可以选择使用栈存储数据(栈,先入后出)
先序:先把根元素存储在栈里面,然后对栈进行弹出,如果根的右孩子存在,就把右孩子存储在栈里,如果根的左孩子存在,就把左孩子放到栈里,对栈弹出。
为什么先右孩子再左孩子?因为先序遍历,根左右。而栈属于先入后出,所以先出左孩子的活,就需要后把左孩子压栈。
后序:看了先序,你是不是觉得后序也很简单了?我们只需要声明两个栈,因为后序是左右根,所以我们需要构造根由左的栈顺序,但是压栈时候,头始终是第一个,如果不出来,那么最后就找不到头了,所以我们需要另外引入一个栈。先把头压入栈1,并且把他弹出,放到栈2,如果它的左孩子存在,那么就在栈1加入左孩子,如果右孩子存在,同理在栈1加入右孩子。然后对栈1弹出,加入栈2.就可以得到我们想要的顺序。
中序:中序就是左右根,需要构造根右左的栈顺序,