大二(上) 数据结构 二叉树的创建和遍历

简单的二叉树的创建和遍历,这算是入门吧。
初版:

#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;
const int INF = 0x3f3f3f3f;
typedef char ElemType;
int heigh = 0;

//二叉链表节点结构的定义
typedef struct BinaryTreeNode{
    ElemType Data;
    struct BinaryTreeNode *lchild, *rchild;
} BinaryTreeNode, *Binarytree;

//先序遍历方法构建二叉树
BinaryTreeNode *PreCreateTree(Binarytree &node){
    char ch;
    ch = getchar();
    if(ch == '#'){
        node = NULL;
    }
    else{
        node = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
        node->Data = ch;
        cout<<node->Data<<endl;
        node->lchild = PreCreateTree(node->lchild);
        node->rchild = PreCreateTree(node->rchild);
    }
    return node;
}

//二叉树中序遍历
void InOrderTransverse(Binarytree node)
{   
    
}

//二叉树先序遍历
void preOrderTransverse(Binarytree node){
    if(node == NULL){
        return ;
    }
    cout<<node->Data<<" ";
    preOrderTransverse(node->lchild);
    preOrderTransverse(node->rchild);
}


int main(){
    BinaryTreeNode *tree;
    
//    Init(&node);
    PreCreateTree(tree);
    preOrderTransverse(tree);
    
//    gethigh(node);
    cout<<heigh<<endl;
    return 0;
}

// ABEH###C#D##MN###

最终版:

#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;
const int INF = 0x3f3f3f3f;
typedef char ElemType;
int heigh = 0;

//二叉链表节点结构的定义
typedef struct BinaryTreeNode 
{
	ElemType Data;
	struct BinaryTreeNode *lchild, *rchild;
} BinaryTreeNode, *Binarytree;

//先序遍历方法构建二叉树
BinaryTreeNode *PreCreateTree(Binarytree &node) {
	char ch;
	ch = getchar();
	if (ch == '#') {
		node = NULL;
	}
	else 
	{
		node = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
		node->Data = ch;
		cout << node->Data << endl;
		node->lchild = PreCreateTree(node->lchild);
		node->rchild = PreCreateTree(node->rchild);
	}
	return node;
}

//二叉树先序遍历
void preOrderTransverse(Binarytree node) {
	if (node == NULL)
		return;
	else 
	{
		cout << node->Data << " ";
		preOrderTransverse(node->lchild);
		preOrderTransverse(node->rchild);
	}
}

//二叉树中序遍历
void InOrderTransverse(Binarytree node)
{
	if (node == NULL)
	   return;
	else
	{
		InOrderTransverse(node->lchild);
		cout << node->Data << " ";
		InOrderTransverse(node->rchild);
	}
}

//二叉树后序遍历
void PostOrderTransverse(Binarytree node)
{
	if (node == NULL)
	   return;
	else 
	{
		PostOrderTransverse(node->lchild);
		PostOrderTransverse(node->rchild);
		cout << node->Data << " ";
	}
}

//计算二叉树的节点总数
int Count(Binarytree node)
{
	if (node == NULL)
		return 0;
	else
	{
		return Count(node->lchild) + Count(node->rchild) + 1;
	}
}

//计算二叉树的高度
int Depth(Binarytree node)
{
	int dep1, dep2;
	if (node == NULL)
		return 0;
	else
	{
		dep1 = Depth(node->lchild);
		dep2 = Depth(node->rchild);
		return dep1 > dep2 ? (dep1 + 1) : (dep2 + 1);
	}
}

//节点左右子树互换
void Exchange(Binarytree node)
{ 
	Binarytree temp;
	if (node) 
	{
		temp = node->lchild;
		node->lchild = node->rchild;
		node->rchild = temp;
		Exchange(node->lchild);
		Exchange(node->rchild);
	}
}

void Delete(Binarytree node)
{
	if (node == NULL) 
		return;
	if (node->lchild != NULL)
	{
		Delete(node->lchild);
	}
	if (node->rchild != NULL)
	{
		Delete(node->rchild);
	}
	delete node;
}


int main() {
	BinaryTreeNode *tree;

	//构建二叉树
	PreCreateTree(tree);

	//打印二叉树
	cout << "\n打印输入的二叉树:" << endl;
	cout << "先序遍历为:" ;
	preOrderTransverse(tree);
	cout << "\n中序遍历为:" ;
	InOrderTransverse(tree);
	cout << "\n后序遍历为:" ;
	PostOrderTransverse(tree);
	cout << endl;

	//交换节点的左右子树
	Exchange(tree);
	cout << "\n交换节点后的二叉树:" <<endl;
	cout << "先序遍历为:" ;
	preOrderTransverse(tree);
	cout << "\n中序遍历为:";
	InOrderTransverse(tree);
	cout << "\n后序遍历为:";
	PostOrderTransverse(tree);
	cout << endl;

	//计算二叉树的高度和节点总数
	int depth=Depth(tree);
	int count=Count(tree);
	cout << "\n二叉树的高度为:"<< depth << endl;
	cout << "二叉树的节点总数为:" << count << endl;

	//释放二叉树所有结点占用的系统内存
	Delete(tree);
	cout << "\n已释放二叉树所有结点占用的系统内存" << endl;
	system("pause");
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值