树
基础遍历
递归遍历
例: 1
2 3
4 5 6 7
1 | void Order(node *head){ |
递归序(访问结点的顺序):1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 7 1
1 | cout<<head->data<<" ";//打印语句位置 |
先序遍历:第一次访问打印 (1)
中序遍历:第二次访问打印(2)
后序遍历:第三次访问打印(3)
迭代遍历
三种遍历都是用的栈
先序遍历
- 头先进栈
- 当栈不为空,弹出cur
- 打印cur
- cur右进栈,左进栈
后序遍历
- 头先进栈
- 当栈不为空,弹出cur
- 打印cur
- cur左进栈,右进栈
- 翻转数组
中序遍历
- 整棵树左边界进栈
- 弹出,打印cur
- cur右子树的左边界进栈
宽度优先遍历/层次遍历
宽度优先遍历用队列
- 头结点先进队
- 循环
- 弹出就打印cur
- 先放左再放右
求二叉树最大宽度
法1:哈希表:(head,1)//第一层
curlevel,curlevelnode,max
弹出结点=当前层,node++
else 说明进入下一层了
——>需要一个哈希表,进队列的时候(left,level+1);
法2:队列
常见概念
搜索二叉树
每一个节点大于左子树,小于右子树
判断:中序遍历,输出一定是升序
完全二叉树
满二叉树
平衡二叉树
任何节点左树和右树的高度差都不超过1
二叉树的递归套路
- 列出所有的可能性
- 整理需要左树、右树提供的信息,封装为结构体,作为返回值(左右子树返回值得是一样的)
- 函数结构
- 空树情况(如果情况比较奇怪,返回NULL,调用的时候再讨论)
- 处理左树,处理右树
- 根据左右子树信息,处理本树
- 返回
递归套路可以解决一切树型dp问题:问题可以通过向左子树和右子树要信息解决
但要具体问题具体分析,也不是所有问题都能用套路