二叉树代码模板总结
(一) 二叉树的遍历
struct node {
typename data; //数据域
node* lchild; //指向左子树根节点的指针
node* rchild;
//层序遍历升级版需要下一行表示层次
//int layer;
}
1 前中后序遍历
以前序为例:
/*c*/
void preorder(node *root) {
if( root == NULL)
return; //到达空树,递归边界(前中后一样)
printf("%d\n", root -> data); //访问根节点
//访问左子树
preorder(root -> lchild);
//访问右子树
preorder(root -> rchild);
}
2 层序遍历
从树根自顶向下,且同层从左到右(需要用到队列)
/*c*/
void LayerOrder(node* root) {
//存放node型变量的地址,可以直接对原元素进行修改
queue<node*> q;
q.push(root); //从根节点地址入队
while( ! q.empty ( ) ){
node* now = q.front(); //取出队首元素
q.pop();
printf("%d",now -> data); //访问队首元素
if( now -> lchild ! = NULL) {
//升级版
//now -> lchild -> layer = now -> layer +1;
//表示左孩子层号为右孩子加1
q.push(now -> lchild) ; //左子树非空
}
if( now -> rchild ! = NULL) {
//升级版同上
q.push(now -> rchild) ; //右子树非空
}
}
}
Eg: 已知先序和中序序列,要求构建一棵二叉树
node* create(int preL, int preR, int inL, int inR){
// 先序序列区间[preL, preR], 中序序列区间[inL, inR]
if(preL > preR) {
return; //递归边界
}
node* root = new node;//新建一个节点
root -> data = pre[preL]; //先序序列第一个值是根节点
for(int i = inL; i <= inR; i++){
if(pre[preL] == in[i])
break; //在中序序列中找到与根节点的值相等的,确定分界线
}
int leftin = i - inL;
root -> lchild = create(preL+1, preL+leftin, inL, i-1);
root -> rchild = create(preL+leftin+1, preR, i+1, inR);
return root;
}
未完待续