说明:本笔记是自己在B站观看视频记录的
数据结构二叉树
class Node{
V value;
Node left;
Node right;
}
二叉树遍历方式:
- 先序遍历
任何子树的处理顺序都是,先头结点、再左子树、然后右子树 - 中序遍历
任何子树的处理顺序都是,先左子树、再头节点、然后右子树 - 后序遍历
任何子树的处理顺序都是,先左子树、再右子树、然后头节点
递归序
非递归方式实现二叉树先序、中序、后序遍历
- 任何递归函数都可以改成非递归
- 自己设计压栈来实现
非递归实现二叉树先序遍历:
设计一个栈,弹出就打印,如有右孩子,压入右孩子;如有左孩子,压入左孩子。
public static void pre(Node head) {
System.out.println("pre-order:");
if (head != null) {
Stack<Node> stack = new Stack<Node>();
stack.add(head);
while (!stack.isEmpty()) {
Node node = stack.pop();
System.out.println(node.value + " ");
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.left);
}
}
}
}
有了前序遍历:
public static void pos1(Node head) {
System.out.println("pos-order:");
if (head != null) {
Stack<Node> s1 = new Stack<Node>();
Stack<Node> s2 = new Stack<Node>();
s1.push(head);
while (!s1.isEmpty()) {
Node node = s1.pop();
// System.out.println(node.value + " ");
s2.push(node);
if (node.left != null) s1.push(node.left);
if (node.right != null) s2.push(node.right);
}
while (!s2.isEmpty())
System.out.print(s2.pop().value+" ");
}
}
中序遍历非递归实现: 整条左边界,依次入栈;1无法执行,弹出打印,右子树继续执行1. 标记临界节点状态,没处理完左孩子就处理左孩子,没处理右孩子就处理右孩子。
二叉树的序列化和反序列化
- 可以用先序或者中序或者后序或者按层遍历,来实现二叉树的序列化
- 用了什么方式序列化,用什么样的方式序列化
内存里的二叉树变成序列化的结果
用什么序列化二叉树,就用什么反序列化生成二叉树