二叉树的基本操作代码实现

该博客详细介绍了如何使用C++实现二叉树的先序创建、先序、中序、后序遍历以及层次遍历。此外,还提供了计算二叉树深度、节点总数和叶子节点总数的函数,并展示了测试样例及其输出。代码实现包括了二叉树的复制功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

二叉树功能函数

测试样例

代码实现


二叉树功能函数

void CreateTree(BiTree& T);                  //先序创建二叉树

void PreOrderTraverse(BiTree T);          //先序遍历

void InOrderTraverse(BiTree T);            //中序遍历

void PostOrderTraverse(BiTree T);        //后序遍历

void levelOrderTraverse(BiTree T);        //层次遍历

int Copy(BiTree T,BiTree &T1);              //复制二叉树

int Depth(BiTree T);                                //计算二叉树深度

int NodeCount(BiTree T);                       //计算二叉树结点总数 

int LeadCount(BiTree T);                        //计算二叉树叶子结点总数 

测试样例

/*------------
树的形状:
         a
     b       c
  d   e   f 
--------------*/

样例输入:

a b d # # e # # c f # # #

样例输出:

二叉树已经按照先序构建
先序遍历:a b d e c f
中序遍历:d b e a f c
后序遍历:d e b f c a
层次遍历:a b c d e f
二叉树的深度为:3
二叉树的结点数为:6
二叉树的叶子结点数为:3
二叉树已复制
复制二叉树的先序遍历:a b d e c f
复制二叉树的中序遍历:d b e a f c
复制二叉树的后序遍历:d e b f c a
复制二叉树的层次遍历:a b c d e f

说明:如果结点为叶子结点,只需将左右孩子的值置为'#',(即紧邻之后的两个输入为'#');

代码实现

#include<bits/stdc++.h>
using namespace std;
typedef char TElemType;
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
 
//先序构造二叉树 
void CreateTree(BiTree& T){
	TElemType ch;
	cin >> ch;
	if(ch == '#')
		T = NULL;
	else {
		T = new BiTNode;
		T->data = ch;
		CreateTree(T->lchild);
		CreateTree(T->rchild);
	}
} 

//先序遍历 
void PreOrderTraverse(BiTree T) {
    if(T == NULL)
    	return ;
    cout << T->data << " ";
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
}

//中序遍历 
void InOrderTraverse(BiTree T) {
    if(T == NULL)
    	return ;
    InOrderTraverse(T->lchild);
    cout << T->data << " ";
    InOrderTraverse(T->rchild);
}

//后序遍历 
void PostOrderTraverse(BiTree T) {
    if(T == NULL)
    	return ;
    PostOrderTraverse(T->lchild);
    PostOrderTraverse(T->rchild);
    cout << T->data << " ";
}

//层次遍历输出二叉树 
void levelOrderTraverse(BiTree T) {
    if(T == NULL)
		return;
    queue<BiTNode*> q;
    q.push(T);
    while(!q.empty()) {
        int n = q.size();
        for(int i = 0; i < n; i++) {
            BiTNode* s = q.front();
            cout << s->data << " ";
            q.pop();
            if(s->lchild)
				q.push(s->lchild);
            if(s->rchild)
				q.push(s->rchild);
        }
    }
}

//复制二叉树 
int Copy(BiTree T,BiTree &T1) {
	if(T == NULL) {
		T1 = NULL;
		return 0;
	}
	T1 = new BiTNode;
	T1->data = T->data;
	Copy(T->lchild, T1->lchild);
	Copy(T->rchild, T1->rchild);
}
 
//计算二叉树深度
int Depth(BiTree T) {
	if(T == NULL)
		return 0;
	int m, n; 
	m = Depth(T->lchild) + 1;
	n = Depth(T->rchild) + 1;
	return max(m, n);
}

//计算二叉树结点总数 
int NodeCount(BiTree T) {
	if(T == NULL)
		return 0;
	return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
} 

//计算二叉树叶子结点总数 
int LeadCount(BiTree T) {
	if(T == NULL)
		return 0;
	if(T->lchild == NULL && T->rchild == NULL)
		return 1;
	return LeadCount(T->lchild) + LeadCount(T->rchild);
} 

int main(){
	BiTree T, T1;
	CreateTree(T);
	cout << "二叉树已经按照先序构建"; 
	cout << endl << "先序遍历:";
    PreOrderTraverse(T);
    cout << endl << "中序遍历:";
    InOrderTraverse(T);
    cout << endl << "后序遍历:";
    PostOrderTraverse(T);
    cout << endl << "层次遍历:";
	levelOrderTraverse(T); 
	cout << endl << "二叉树的深度为:";
	cout << Depth(T); 
	cout << endl << "二叉树的结点数为:";
	cout << NodeCount(T); 
	cout << endl << "二叉树的叶子结点数为:";
	cout << LeadCount(T); 
	cout << endl << "二叉树已复制";
	Copy(T, T1); 
	cout << endl << "复制二叉树的先序遍历:";
    PreOrderTraverse(T1);
    cout << endl << "复制二叉树的中序遍历:";
    InOrderTraverse(T1);
    cout << endl << "复制二叉树的后序遍历:";
    PostOrderTraverse(T1);
    cout << endl << "复制二叉树的层次遍历:";
	levelOrderTraverse(T1); 
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值