《数据结构和算法》【二叉树】C++链表描述

定义

二叉树是用有限个线段连接的有限个节点的集合,有一个唯一的特殊节点叫根节点,其余的节点,要么是树中某个节点的左节点,要么是树中某个节点的右节点。某个节点的左节点与某个节点的右节点通过线段连接。

属性

二叉树有一些属性,能帮助了解二叉树。
1、二叉树的每个元素都恰好有两个子树,其中可能有一个或两个是空的。
2、子树分左子树和右子树,顺序不能混淆
3、边数=节点数-1:一颗二叉树的连接线段数目,刚好是它的节点数目减一。
4、层数:节点有对应的层数,根节点在第一层,子节点的层数为父节点的层数加一。
4、高度:二叉树的最大层数,称为高度。
5、已知高度为h,则最少节点数为h,最大节点数为2的h次方-1。
6、满二叉树:二叉树的节点个数为2的h次方-1.
7、完全二叉树:将某二叉树的节点从左往右、从上往下依次编号(1、2、。。。),对应位置的编号与相同高度的满二叉树的对应节点的编号完全相同。

二叉树的遍历

遍历分为前序遍历、中序遍历、后序遍历。
二叉树的当前节点:一般指中间的节点、父节点,要相对某个子树而言。比如:第二层的节点的当前节点就是根节点。

前序遍历:不管在什么情况下,都先访问当前节点,再访问当前节点的左节点,最后访问当前节点的右节点。
中序遍历:不管在什么情况下,都先访问当前节点的左节点,再访问当前节点,最后访问当前节点的右节点。
后序遍历:不管在什么情况下,都先访问当前节点的左节点,再访问当前节点的右节点,最后访问当前节点。

二叉树的链表描述

节点结构体

将每一个节点,用一个结构体描述。
基础需要:值、左节点、右节点
代码如下

template<class T>
struct binaryTreeNode
{
	T element;
	binaryTreeNode<T> * leftChild;
	binaryTreeNode<T> * rightChild;
	binaryTreeNode() { leftChild = rightChild = NULL; }
	binaryTreeNode(const T & theElement)
	{
		element = theElement;
		leftChild = rightChild = NULL;
	}
	//赋值一个节点的时候,顺便赋值左节点、右节点
	binaryTreeNode(const T &theElement,binaryTreeNode<T> * theLeftChild,binaryTreeNode<T> * theRightChild)
	{
		element = theElement;
		leftChild = theLeftChild;
		rightChild = theRightChild;

	}
};

类linkBinaryTree

节点的尺寸:总的节点数。

class linkBinaryTree 
{
public:
	linkBinaryTree() { root = NULL; treeSize = 0; }
	~linkBinaryTree()
	{
		release(root);
	}

	void makeTree(T element,linkBinaryTree<T>&left,linkBinaryTree<T>&right);//创建一个节点
	void release(binaryTreeNode<T> * bTreeNode_struct);//释放
	//先序遍历
	void preOrderOutput();
	//中序遍历
	void inOrderOutput();
	//后序遍历
	void postOrderOutput();
	int getSize()const { return treeSize; }
	bool empty() { return treeSize == 0; }

private:
	int treeSize;
	binaryTreeNode<T> *root;
	void preOrderOutput(binaryTreeNode<T> * bTreeNode_struct);
	void inOrderOutput(binaryTreeNode<T> * bTreeNode_struct);
	void postOrderOutput(binaryTreeNode<T> * bTreeNode_struct);
};

template<class T>
inline void linkBinaryTree<T>::makeTree(T element, linkBinaryTree<T>&left, linkBinaryTree<T>&right)
{
	root = new binaryTreeNode<T>(element, left.root, right.root);
	treeSize = left.treeSize + right.treeSize + 1;
	left.root =right.root= NULL;
	left.treeSize = right.treeSize = 0;
}

template<class T>
inline void linkBinaryTree<T>::release(binaryTreeNode<T>* bTreeNode_struct)
{
	if (bTreeNode_struct != nullptr)
	{
		release(bTreeNode_struct->leftChild);
		release(bTreeNode_struct->rightChild);
		delete bTreeNode_struct;
	}

}

template<class T>
inline void linkBinaryTree<T>::preOrderOutput()
{
	preOrderOutput(root);
}

template<class T>
inline void linkBinaryTree<T>::inOrderOutput()
{
	inOrderOutput(root);
}

template<class T>
inline void linkBinaryTree<T>::postOrderOutput()
{
	postOrderOutput(root);
}

template<class T>
inline void linkBinaryTree<T>::preOrderOutput(binaryTreeNode<T>* bTreeNode_struct)
{
	if (bTreeNode_struct != NULL)
	{
		cout << bTreeNode_struct->element;
		preOrderOutput(bTreeNode_struct->leftChild);
		preOrderOutput(bTreeNode_struct->rightChild);
	}

}

template<class T>
inline void linkBinaryTree<T>::inOrderOutput(binaryTreeNode<T>* bTreeNode_struct)
{
	if (bTreeNode_struct != NULL)
	{
		inOrderOutput(bTreeNode_struct->leftChild);
		cout << bTreeNode_struct->element;
		inOrderOutput(bTreeNode_struct->rightChild);
	}

}

template<class T>
inline void linkBinaryTree<T>::postOrderOutput(binaryTreeNode<T>* bTreeNode_struct)
{
	if (bTreeNode_struct != NULL)
	{
		postOrderOutput(bTreeNode_struct->leftChild);
		postOrderOutput(bTreeNode_struct->rightChild);
		cout << bTreeNode_struct->element;
	}
}

完整的代码以及运行结果

binaryTreeNode.h

#pragma once
template<class T>
struct binaryTreeNode
{
	T element;
	binaryTreeNode<T> * leftChild;
	binaryTreeNode<T> * rightChild;
	binaryTreeNode() { leftChild = rightChild = NULL; }
	binaryTreeNode(const T & theElement)
	{
		element = theElement;
		leftChild = rightChild = NULL;
	}
	binaryTreeNode(const T &theElement,binaryTreeNode<T> * theLeftChild,binaryTreeNode<T> * theRightChild)
	{
		element = theElement;
		leftChild = theLeftChild;
		rightChild = theRightChild;
	}
};

linkBinaryTree.h

#pragma once
#include"binaryTreeNode.h"
#include<iostream>
using namespace std;
template<class T>
class linkBinaryTree 
{
public:
	linkBinaryTree() { root = NULL; treeSize = 0; }
	~linkBinaryTree()
	{
		release(root);
	}

	void makeTree(T element,linkBinaryTree<T>&left,linkBinaryTree<T>&right);//创建一个节点
	void release(binaryTreeNode<T> * bTreeNode_struct);//释放
	void preOrderOutput();
	void inOrderOutput();
	void postOrderOutput();
	int getSize()const { return treeSize; }
	bool empty() { return treeSize == 0; }

private:
	int treeSize;
	binaryTreeNode<T> *root;
	void preOrderOutput(binaryTreeNode<T> * bTreeNode_struct);
	void inOrderOutput(binaryTreeNode<T> * bTreeNode_struct);
	void postOrderOutput(binaryTreeNode<T> * bTreeNode_struct);
};

template<class T>
inline void linkBinaryTree<T>::makeTree(T element, linkBinaryTree<T>&left, linkBinaryTree<T>&right)
{
	root = new binaryTreeNode<T>(element, left.root, right.root);
	treeSize = left.treeSize + right.treeSize + 1;
	left.root =right.root= NULL;
	left.treeSize = right.treeSize = 0;
}

template<class T>
inline void linkBinaryTree<T>::release(binaryTreeNode<T>* bTreeNode_struct)
{
	if (bTreeNode_struct != nullptr)
	{
		release(bTreeNode_struct->leftChild);
		release(bTreeNode_struct->rightChild);
		delete bTreeNode_struct;
	}
}

template<class T>
inline void linkBinaryTree<T>::preOrderOutput()
{
	preOrderOutput(root);
}

template<class T>
inline void linkBinaryTree<T>::inOrderOutput()
{
	inOrderOutput(root);
}

template<class T>
inline void linkBinaryTree<T>::postOrderOutput()
{
	postOrderOutput(root);
}

template<class T>
inline void linkBinaryTree<T>::preOrderOutput(binaryTreeNode<T>* bTreeNode_struct)
{
	if (bTreeNode_struct != NULL)
	{
		cout << bTreeNode_struct->element;
		preOrderOutput(bTreeNode_struct->leftChild);
		preOrderOutput(bTreeNode_struct->rightChild);
	}
}

template<class T>
inline void linkBinaryTree<T>::inOrderOutput(binaryTreeNode<T>* bTreeNode_struct)
{
	if (bTreeNode_struct != NULL)
	{
		inOrderOutput(bTreeNode_struct->leftChild);
		cout << bTreeNode_struct->element;
		inOrderOutput(bTreeNode_struct->rightChild);
	}
}

template<class T>
inline void linkBinaryTree<T>::postOrderOutput(binaryTreeNode<T>* bTreeNode_struct)
{
	if (bTreeNode_struct != NULL)
	{
		postOrderOutput(bTreeNode_struct->leftChild);
		postOrderOutput(bTreeNode_struct->rightChild);
		cout << bTreeNode_struct->element;
	}
}

cpp执行文件

#include"linkBinaryTree.h"

int main()
{
	//linkBinaryTree<int> a, b, c;
	//b.makeTree(1, a, a);
	//b.preOrderOutput();

	linkBinaryTree<int> a, x, y, z;
	y.makeTree(1, a, a);
	z.makeTree(2, a, a);
	x.makeTree(3, y, z);
	y.makeTree(4, x, a);
	cout << "先序遍历:"<<endl;
	y.preOrderOutput();
	cout << endl << "中序遍历:" << endl;
	y.inOrderOutput();
	cout << endl << "后序遍历:" << endl;

	y.postOrderOutput();
	cout << endl;
	cout << "大小:";
	cout << y.getSize();
	return 0;
}





结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值