二叉树的基本操作的c++实现

   二叉树的算法。
   先给出结点的类,顾名思义。是用来表示树的每个结点咯。里面包含char型的data(因为我想是让树的结点值是字母,如果你希望是数字那就int啥的,这个随意吧~)

代码如下:

 

//Focus.L carpe diem :)

//BiTree node.h
#ifndef NODE_H_
#define NODE_H_
#define NULL 0

//结点的类
class node{
public:
	char data;   //结点值
	node *lchild, *rchild;  //左孩子,右孩子结点
	node *parent;    //父结点
	//构造函数
	node()
	{
		data = 0;
		lchild = NULL;
		rchild = NULL;
		parent = NULL;
	}
}BiTree;



#endif

   然后就是具体的操作咯。分为二叉树的初始化,建立二叉树,先序遍历,中序遍历,后序遍历,层次遍历,求二叉树的深度,求二叉树的结点数,二叉树的复制。代码如下:

//Focus.L carpe diem :)

//BiTree 
#include <iostream>
#include <cstdio>
#include <cstring>
#include "node.h"

using namespace std;

//函数声明

//二叉树初始化
node *InitBiTree();
//销毁二叉树
void DestroyBiTree(node *&T);
//建立二叉树
void CreateBiTree(node *&T);
//先序遍历二叉树
void PreOrderTraverse(node *T);
//中序遍历二叉树
void InOrderTraverse(node *T);
//后序遍历二叉树
void PostOrderTraverse(node *T);
//层次遍历二叉树
void LevelOrderTraverse(node *T);
int printLevelOrderTraverse(node *T, int level);
//二叉树的深度
int BiTreeDepth(node *T);
//二叉树的结点数
int BiTreeNodes(node *T);
//二叉树的复制
void BiTreeDuplicate(node *T, node *&T1);


//二叉树初始化
node *InitBiTree()
{
	node *T = new node();
	return T;
}

//node & initBiTree(){
//	node * T = new node();
//	return *T;
//}

//销毁二叉树
void DestroyBiTree(node *&T)
{
	if (T->lchild != NULL)
		DestroyBiTree(T->lchild);
	if (T->rchild != NULL)
		DestroyBiTree(T->rchild);
	delete(T);
}

//建立二叉树
void CreateBiTree(node *&T)
{
	char ch;
	//cout << "please enter the keys:" << endl;
	cin >> ch;
	if (ch == '#')
		T = NULL;
	else
	{
		T = new node();
		T->data = ch;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
	}
}

//先序遍历二叉树
void PreOrderTraverse(node *T)
{
	if (T != NULL)
	{
		cout << T->data;
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
	}
}

//中序遍历二叉树
void InOrderTraverse(node *T)
{
	if (T != NULL)
	{
		InOrderTraverse(T->lchild);
		cout << T->data;
		InOrderTraverse(T->rchild);
	}
}

//后序遍历二叉树
void PostOrderTraverse(node *T)
{
	if (T != NULL)
	{
		PostOrderTraverse(T->lchild);
		PostOrderTraverse(T->rchild);
		cout << T->data;
	}
}

//层次遍历二叉树算法
int printLevelOrderTraverse(node *T, int level)
{
	if (!T || level < 0)
		return 0;
	if (level == 0)
	{
		cout << T->data << " ";
		return 1;
	}
	return printLevelOrderTraverse(T->lchild, level - 1) + printLevelOrderTraverse(T->rchild, level - 1);
}
void LevelOrderTraverse(node *T)
{
	int i = 0;
	for (i = 0;; i++)
	{
		if (!printLevelOrderTraverse(T, i))
			break;
	}
	cout << endl;
}

//二叉树的深度
int BiTreeDepth(node *T)
{
	if (T)
	{
		int depl, depr;
		depl = BiTreeDepth(T->lchild);
		depr = BiTreeDepth(T->rchild);
		if (depl >= depr)
			return (depl + 1);
		else
			return (depr + 1);
	}
	return 0;
}

//二叉树的结点数
int BiTreeNodes(node *T)
{
	if (T)
	{
		int num;
		num = BiTreeNodes(T->lchild);
		num = num + BiTreeNodes(T->rchild);
		num++;
		return num;
	}
	return 0;
}

//二叉树的复制
void BiTreeDuplicate(node *T, node *&T1)
{
	if (T)
	{
		T1 = new node();
		T1->data = T->data;
		T1->lchild = T1->rchild = NULL;
		BiTreeDuplicate(T->lchild, T1->lchild);
		BiTreeDuplicate(T->rchild, T1->rchild);
	}
}

//菜单
void menu()
{
	cout << "*******************Menu********************" << endl;
	cout << "enter the No of the operation you wanna do:" << endl;
	cout << "1.PreOrderTraverse" << "           " << "2.InOrderTraverse" << endl;
	cout << "3.PostOrderTraverse" << "          " << "4.LevelOrderTraverse" << endl;
	cout << "5.Get the depth of the tree" << "  " << "6.Get the numbers of the nodes" << endl;
	cout << "7.Duplicate the tree and print as PreOrderTraverse" << endl;
}


int main()
{
	int n;
	node *BiTree, *BiTree1;
	BiTree = new node();
	cout << "以先序顺序输入二叉树,#表示空结点,应将二叉树的所有结点都输入进去" << endl;
	cout << "Example 想输入a为父结点,b和c分别为左右孩子结点的时候则输入: ab##c## " << endl;
	cout << "please enter the keys:" << endl;
	InitBiTree();
	CreateBiTree(BiTree);
	menu();
	cin >> n;
	switch (n)
	{
	case(1):
		cout << "PreOrderTraverse result:" << endl;
		PreOrderTraverse(BiTree);
		cout << endl;
		break;
	case(2) :
		cout << "InOrderTraverse result:" << endl;
		InOrderTraverse(BiTree);
		cout << endl;
		break;
	case(3) :
		cout << "PostOrderTraverse result:" << endl;
		PostOrderTraverse(BiTree);
		cout << endl;
		break;
	case(4) :
		cout << "LevelOrderTraverse result:" << endl;
		LevelOrderTraverse(BiTree);
		cout << endl;
		cout << "(PreOrderTraverse the new BiTree)" << endl;
		break;
	case(5) :
		cout << "Depth of the BiTree is:" << endl;
		cout << BiTreeDepth(BiTree) << endl;
		break;
	case(6) :
		cout << "Numbers of the BiTree Nodes is:" << endl;
		break;
		cout << BiTreeNodes(BiTree) << endl;
	case(7):
		cout << "The Duplicated Tree is:" << endl;
		BiTreeDuplicate(BiTree, BiTree1);
		PreOrderTraverse(BiTree1);
		cout << endl;
		break;
	}
	return 0;
}



     由于二叉树的各种操作较为简单,里面也稍加注释,所以就不再累述。写blog只为自己记录下来,也是小白,欢迎大家前来斧正:)



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树是一种非常常见的数据结构,它由一个根节点以及每个节点最多有两个子节点组成。以下是二叉树基本操作及其c++代码实现: 1. 创建一个二叉树 ```c++ struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; TreeNode* createTree() { int val; cin >> val; if (val == -1) { return NULL; } TreeNode* root = new TreeNode(val); root->left = createTree(); root->right = createTree(); return root; } ``` 2. 二叉树的遍历(前序遍历、中序遍历、后序遍历) ```c++ // 前序遍历 void preorderTraversal(TreeNode* root) { if (root == NULL) { return; } cout << root->val << " "; preorderTraversal(root->left); preorderTraversal(root->right); } // 中序遍历 void inorderTraversal(TreeNode* root) { if (root == NULL) { return; } inorderTraversal(root->left); cout << root->val << " "; inorderTraversal(root->right); } // 后序遍历 void postorderTraversal(TreeNode* root) { if (root == NULL) { return; } postorderTraversal(root->left); postorderTraversal(root->right); cout << root->val << " "; } ``` 3. 求二叉树的深度 ```c++ int maxDepth(TreeNode* root) { if (root == NULL) { return 0; } int leftDepth = maxDepth(root->left); int rightDepth = maxDepth(root->right); return max(leftDepth, rightDepth) + 1; } ``` 4. 判断是否为平衡二叉树 ```c++ bool isBalanced(TreeNode* root) { if (root == NULL) { return true; } int leftDepth = maxDepth(root->left); int rightDepth = maxDepth(root->right); if (abs(leftDepth - rightDepth) > 1) { return false; } return isBalanced(root->left) && isBalanced(root->right); } ``` 5. 判断是否为对称二叉树 ```c++ bool isSymmetric(TreeNode* root) { if (root == NULL) { return true; } return isSymmetricHelper(root->left, root->right); } bool isSymmetricHelper(TreeNode* leftNode, TreeNode* rightNode) { if (leftNode == NULL && rightNode == NULL) { return true; } if (leftNode == NULL || rightNode == NULL) { return false; } if (leftNode->val != rightNode->val) { return false; } return isSymmetricHelper(leftNode->left, rightNode->right) && isSymmetricHelper(leftNode->right, rightNode->left); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值