当森林为只有一颗树的时候才为树
叶子是终端结点
没什么难度过一遍就行
二叉树为了体现结点间的关系,需要浪费很多空间
一共有n个结点,有2n个指针域,其中有n-1个指针域是有存值的(每个结点都对应一个指针域),可以算出空指针为n+1
因为二叉链表找孩子方便,找双亲困难,所以引入三叉链表,存放双亲元素的地址
这里我总结出一个规律:先序遍历方法是从上往下,并且要把左子树遍历完再遍历右子树,而中序和后序都是从下往上的
先序遍历:A B D G C E H F
中序遍历:D G B A E H C F
后序遍历:G D B H E F C A
实例转换表达式的形式
l 在先序遍历中,每个结点只经过一次,中序遍历中,有左、右孩子的结点要经过两次(先去中序遍历它的左子树,从左子树返回时才访问它),而后序中,有左、右孩子的结点要经过三次。
l 三种遍历算法的时间复杂度都是O(n)。
l 所需辅助空间为栈空间,栈的容量为树的高度,最多不超过n,所以空间复杂度也为O(n)。
因为遍历用到的方法为递归用的是函数栈,是栈空间,后进先出
这里用的是非递归算法,用的也是栈空间,Push是进栈,Pop是出栈
p先指向A,p不为空,指向左孩子B,又不为空,再指向左孩子为空,此时栈顶元素q指向B,出栈并输出B,p指向又孩子D,D入栈,p指向D的左孩子为空,D出栈,q指向D,并输出,依此类推……
层次遍历:
还是用递归算法,每次调用结束后都会返回
根据先序遍历算法复制二叉树
上面应该是leafcount
32位环境指针占4个字节,与int相同,16位环境指针占2个字节,指针大小与编译环境有关,与指向类型无关
有点类似循环链表
树和森林:
带双亲的孩子链表,无论是找双亲还是找孩子都很方便
树和二叉树的二叉树表示法不同点在于二叉树存储的是左孩子和右孩子,而树存储的是第一个孩子和最近一个兄弟结点。
树转换成二叉树底层是通过二叉链表作为交换的媒介,给定一个树只有一个固定的二叉树对应。
快捷画法,二叉树变成树就反过来
二叉树有四种遍历方式,多了一个中根遍历