二叉树的相关操作

二叉树的相关操作

//定义节点
typedef struct TreeNode{
	struct TreeNode *lchild;
	struct TreeNode *rchild;
	int data;
}BiTreeNode, *BiTree;
//【注意】在有修改树的情况下,必须用指针做参数,即BiTree &root,不能写成BiTreeNode root。


void createBiTree(BiTree &T){ //先序建树:中左右 
	int data;
	scanf("%d",&data);
	if(data==0)  T=NULL;   //如果是0表示它的对应子树为空 
	else{
		T=new TreeNode;  
//或者T=(BiTree)malloc(sizeof(BiTreeNode));
		T->data=data;
		createBiTree(T->lchild);
		createBiTree(T->rchild);	
	}	
}

//其余中序和后序,格式一样
void Preorder(BiTree &root){ 
	if(root){
		printf("%d ",root->data);
		Preorder(root->lchild);
		Preorder(root->rchild);         //尾递归容易改成递推形式 
	}
} 

int NodeNum(BiTree &root){  //总节点数数目 
	if(root==NULL) return 0;
	else return 1+NodeNum(root->lchild)+NodeNum(root->rchild);
}

int LeafNum(BiTree &root){  //叶子结点数目 
	if(root==NULL) return 0;
	else if(root->lchild==NULL&&root->rchild==NULL) return 1;
	else return(LeafNum(root->lchild)+LeafNum(root->rchild));
}


int DepthOfTree(BiTree &root){  //计算树的深度 
    if(root)
        return DepthOfTree(root->lchild)>DepthOfTree(root->rchild)?
				DepthOfTree(root->lchild)+1:DepthOfTree(root->rchild)+1;
//加1是在加本层 
    else if(root==NULL)  return 0; 
}


//树的层次遍历
void levelOrder(BiTree &root){
	if(root==NULL)  return;
	queue<BiTree> q;
	BiTree temp;
	q.push(root);
	while(!q.empty()){
		temp=q.front();
		q.pop();
		printf("%d ",temp->data);
		if(temp->lchild)  q.push(temp->lchild);
		if(temp->rchild)  q.push(temp->rchild);
	} 
}


int main(){
//	scanf("%d",&sum);
	TreeNode *root=NULL;
	createBiTree(root);
    levelOrder(root);
	return 0;
}

关于层次遍历,还有一种写法需要用到该节点属于哪一层,此时需要加一个size即可。

void levelOrder(BiTree &root){
	if(root==NULL)  return;
	queue<BiTree> q;
	BiTree temp;
	q.push(root);
	while(!q.empty()){
		//在这里加入一个size
		int size=q.size(); 
		for(int i=0;i<size;i++){
			temp=q.front();
			if(i==0) printf("%d ",q.front()->data);
			q.pop();	
			if(temp->lchild)  q.push(temp->lchild);
			if(temp->rchild)  q.push(temp->rchild);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值