树之二叉树 代码模板总结

二叉树代码模板总结

(一) 二叉树的遍历

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;
}

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值