树:
一棵树由若干子树组成,树是递归定义的。
树的表现形式:孩子兄弟表示法
二叉树:
每个节点的度<=2
树是递归定义的,整棵树是二叉树,那么二叉树的每棵子树也是二叉树。
满二叉树 完全二叉树
二叉树的存储:顺序存储和链式存储
顺序存储:孩子表示法和孩子双亲表示法
手动创建一棵二叉树
二叉树的遍历
前序遍历、中序遍历、后序遍历、层序遍历
前序遍历结果(根左右):1 2 3 4 5 6
中序遍历结果(左根右):3 2 1 5 4 6
后序遍历结果(左右根):3 2 5 6 4 1
层序遍历结果(从根出发,一层一层遍历):1 2 4 3 5 6
注意:
1.如果只给一个遍历,不能创建一棵二叉树
2.确定一个二叉树需要:前序+中序、后续+中序(中序用来确定左右子树)
Oj中:
二叉树的基本操作
oj例题:
翻转二叉树
注意:判断整棵树是高度平衡的二叉树,要保证每棵子树都是平衡的二叉树
思路:先求当前root节点是否是平衡的,再去判断左树是不是平衡的,右数是不是平衡的。
时间复杂度是O()的算法
时间复杂度是O(N)的算法
二叉树的层序遍历:
采用队列 进行入队和出队操作
确定每一层
判断是否是完全二叉树:
1.完全二叉树,每一层都是紧凑靠左排列的
2.叶子节点都在倒数第一层或者倒数第二层
修正:把第33行的int i=0;提前到31行并且修改为 private static int i=0;
这样i是全局变量,递归过程中i是累加的,不会从0再开始。
思路:1.存放从根节点到要找到节点之间的路径
2.找到两条路径的公共交点
方法二:
二叉搜索树:根的左边数值比它小,根的右边数值比它大。
二叉树的前序遍历的非递归实现
注意外部循环的条件
二叉树的中序遍历的非递归实现
前序中序不同的是添加到数组中的时机不同
后序遍历的非递归实现