链式二叉树C++(附带可执行源码)

本文介绍了链式二叉树的基本概念,包括节点类的定义、构造与析构函数,以及树类中的插入操作、中序、后序、先序遍历、获取深度、叶子节点数、同一层节点和节点最大值等功能的实现。
摘要由CSDN通过智能技术生成

     不同于线性表的一对一(一个节点只有一个直接前驱和一个直接后继),树是一对多的一种数据结构。(一个节点对应多个直接后继)。由于n叉树在实现过程中其分叉数目不定,而n叉树的问题大多可以化解成二叉树来理解,所以二叉树是重点研究对象。

链式二叉树是二叉树的一种存储形式,它的操作更加简单灵活,便于对于二叉树中的节点进行增删。

链式二叉树类

在链式二叉树构建类时,将节点类和树类分开定义

节点类及其构造函数析构函数

using namespace std;
template<typename T>
class TreeNode
{
public:
	T val;
	TreeNode<T>* left;
	TreeNode<T>* right;
public:
	TreeNode(T value);
	~TreeNode();
	
};

template<typename T>
inline TreeNode<T>::TreeNode(T value)
{
	val = value;
	left = nullptr;
	right = nullptr;
}

template<typename T>
inline TreeNode<T>::~TreeNode()
{
	delete right;
	delete left;
	left = nullptr;
	right = nullptr;
}

 树类

template<typename T>
class BinaryTree
{
private:
	TreeNode<T>* root;//创建节点类
public:
	BinaryTree();//构造函数
	~BinaryTree();//析构函数
	void insert(T value);//搜索二叉树插入函数
	TreeNode<T>* insertNode(TreeNode<T>* Node, T value);
	void leftTraversal();//中序遍历
	void leftTraversal(TreeNode<T>* node);
	void rightTraversal();//后序遍历
	void rightTraversal(TreeNode<T>*node);
	void midTraversal();//前序遍历
	void midTraversal(TreeNode<T>* node);
	int getDepth();//等到深度
	int getDepth(TreeNode<T>* node);
	int getleafCount();//叶子节点数
	int getleafCount(TreeNode<T>* node);
	void printsamelevel(int level);//各层的数据
	void printsamelevel(TreeNode<T>* node,int level);
	void destory(TreeNode<T>* node);//销毁树
	T getMaxvalue();//等到最大的数据
	T getMaxvalue(TreeNode<T>* node);
	T getParentNode(T value);
	TreeNode<T>* getParentNode(TreeNode<T>* node, T value);
};

构造及析构函数

template<typename T>
inline BinaryTree<T>::BinaryTree()//构造函数
{
	root = nullptr;//将根节点赋值为空
}

template<typename T>
inline BinaryTree<T>::~BinaryTree()
{
	destory(root);//递归将二叉树销毁
}

 增加节点

template<typename T>
inline TreeNode<T>* BinaryTree<T>::insertNode(TreeNode<T>* Node, T value)
{
	
	if (Node == nullptr)//当头节点都没有的时候,说明没有这个树
	{
		return new TreeNode<T>(value);//将这个节点进行赋值
	}
	else
	{
		bool isleft;
		cout << "向左[1]  向右[0]" << endl;
		cin >> isleft;
		if (isleft)//插入到左子树
		{
			Node->left = insertNode(Node->left, value);//向左递归
		}
		else
		{
			Node->right = insertNode(Node->right, value);//插入到右子树
		}
	}
	return Node;
}

 中序遍历(LDR)

template<typename T>
inline void BinaryTree<T>::leftTraversal()
{
	leftTraversal(root);
}

template<typename T>//中序遍历
inline void BinaryTree<T>::leftTraversal(TreeNode<T>* node)
{
	if (node != nullptr)
	{
		leftTraversal(node->left);
		cout << node->val << " ";
		leftTraversal(node->right);
	}
}

后序遍历

template<typename T>
inline void BinaryTree<T>::rightTraversal()
{
	rightTraversal(root);
}

template<typename T>//后序遍历
inline void BinaryTree<T>::rightTraversal(TreeNode<T>* node)
{
	if (node != nullptr)
	{
		rightTraversal(node->left);
		rightTraversal(node->right);
		cout << node->val << " ";
	}
}

先序遍历

template<typename T>
inline void BinaryTree<T>::midTraversal()
{
	midTraversal(root);
}

template<typename T>//先序遍历
inline void BinaryTree<T>::midTraversal(TreeNode<T>* node)
{
	if (node != NULL)
	{
		cout << node->val << " ";
		midTraversal(node->left); 
		midTraversal(node->right);
	}
}

 获取深度

template<typename T>
inline int BinaryTree<T>::getDepth()
{
	return getDepth(root);
}

template<typename T>
inline int BinaryTree<T>::getDepth(TreeNode<T>* node)
{
	if (node == nullptr)
	{
		return 0;
	}
	int leftDepth = getDepth(node->left);
	int rightDepth = getDepth(node->right);
	return max(leftDepth, rightDepth) + 1;
}

获取叶子节点

template<typename T>
inline int BinaryTree<T>::getleafCount()
{
	return getleafCount(root);
}

template<typename T>
inline int BinaryTree<T>::getleafCount(TreeNode<T>* node)
{
	if (node == nullptr)
	{
		return 0;
	}
	if (node->left == nullptr && node->right == nullptr)
	{
		return 1;
	}
	return getleafCount(node->left) + getleafCount(node->right);
}

获取同层节点

template<typename T>
inline void BinaryTree<T>::printsamelevel(int level)
{
	printsamelevel(root, level);
}

template<typename T>
inline void BinaryTree<T>::printsamelevel(TreeNode<T>* node, int level)
{
	if (node == nullptr)
	{
		return;
	}
	if (level == 1)
	{
		cout << node->val << " ";
	}
	else if (level > 1)
	{
		printsamelevel(node->left, level - 1);
		printsamelevel(node->right, level - 1);
	}
}

 获取节点最大值

 

template<typename T>
inline T BinaryTree<T>::getMaxvalue(TreeNode<T>* node)
{
	if (node == nullptr)
	{
		return 0;
	}
	int maxValue = node->val;
	int leftmax = getMaxvalue(node->left);
	int rightmax = getMaxvalue(node->right);
	if (leftmax > maxValue)
	{
		maxValue = leftmax;
	}
	if (rightmax > maxValue)
	{
		maxValue = rightmax;
	}
	return maxValue;
}

获取双亲节点

template<typename T>
inline TreeNode<T>* BinaryTree<T>::getParentNode(TreeNode<T>* node, T value)
{
	if (node == nullptr || node->val == value)
	{
		return nullptr;
	}
	else if ((node->left != nullptr && node->left->val == value) || (node->right != nullptr && node->right->val == value))
	{
		return node;
	}
	else
	{
		TreeNode<T>* parent = getParentNode(node->left, value);
		if (parent == nullptr)
		{
			parent = getParentNode(node->right, value);
		}
		return parent;
	}
}

主函数

#include"BInaryTree.h"
#include"Leader.h"
void menu()
{
	cout << "\t\t\t\t\t" << "[*************************************************]" << endl;
	cout << "\t\t\t\t\t" << "[*****************链式二叉树**********************]" << endl;
	cout << "\t\t\t\t\t" << "[*************************************************]" << endl;
	cout << "\t\t\t\t\t" << "[*****************1.插入数据**********************]" << endl;
	cout << "\t\t\t\t\t" << "[*****************2.中序遍历**********************]" << endl;
	cout << "\t\t\t\t\t" << "[*****************3.后序遍历**********************]" << endl;
	cout << "\t\t\t\t\t" << "[*****************4.先序遍历**********************]" << endl;
	cout << "\t\t\t\t\t" << "[*****************5.获取深度**********************]" << endl;
	cout << "\t\t\t\t\t" << "[*****************6.获取叶子节点数****************]" << endl;
	cout << "\t\t\t\t\t" << "[*****************7.获取同层节点******************]" << endl;
	cout << "\t\t\t\t\t" << "[*****************8.获取节点最大值****************]" << endl;
	cout << "\t\t\t\t\t" << "[*****************9.获取孩子双亲******************]" << endl;
	cout << "\t\t\t\t\t" << "[*************************************************]" << endl;
}



int main()
{
	BinaryTree<int>Tree;
	while (1)
	{
		menu();
		int x;
		cout << "请输入你的选择" << endl;
		cin >> x;
		switch (x)
		{
		case 1:
		{
			int data;
			cout << "请输入你的数据" << endl;
			cin >> data;
			Tree.insert(data);
		}break;
		case 2:
		{
			Tree.leftTraversal();
		}break;
		case 3:
		{
			Tree.rightTraversal();
		}break;
		case 4:
		{
			Tree.midTraversal();
		}break;
		case 5:
		{
			cout << "二叉树深度:" << Tree.getDepth() << endl;
		}break;
		case 6:
		{
			cout << "二叉树叶子节点个数:" << Tree.getleafCount() << endl;
		}break;
		case 7:
		{
			int level;
			cout << "你要查询哪一层?" << endl;
			cin >> level;
			Tree.printsamelevel(level);
		}break;
		case 8:
		{
			cout << "所有节点最大值:" << Tree.getMaxvalue() << endl;
		}break;
		case 9:
		{
			int val;
			cout << "请输入你要查找的值" << endl;
			cin >> val;
			cout << "改节点的双亲:" << Tree.getParentNode(val) << endl;
		}
		}
		system("pause");
		system("cls");
	}
}

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值