数据结构-普通二叉树

 1.二叉树-----普通树
1.1 二叉树长什么样子
1.1.1 空二叉树
1.1.2 只有根结点的二叉树
1.1.3 只有左子树
1.1.4 只有右子树
1.1.5 左右子树都健全
满二叉树  除了叶子节点之外,所有节点都是满的
完全二叉树  除了最后一个节点以及叶子节点,剩下的结点要是满的
   1.2 基本概念
1.2.1 根结点
1.2.2 左子树指针,右子树指针,左子树,右子树
1.2.3 兄弟节点/姊妹节点
1.2.4 双亲结点(存在父子关系)
1.2.5 父节点,和孩子结点
1.2.6 深度和广度
深度(高度):多少层数--->描述树 
广度:多宽,用线的 个数--->描述结点
  1.3 一些数学规律
1.3.1 二叉树有n个结点 n>0; n-1个边
1.3.2 二叉树深度(高度) h,h>0 h<=元素个数<=2^h-1
1.3.3 二叉树结点为n个,n>0,最大深度n,  最小深度  log2(n+1)
1.3.4 二叉树的编号:  1<=i<=n;
1.3.4.1 i=1 根结点 假设孩子结点的序号是iChild 父节点序号就是iChild/2
1.3.4.2 2i>n 序号为i的结点没有左孩子
1.3.4.3 2i+1>n  i元素没有右孩子
   2.存储

   3.遍历
3.1 先序(前序)
根--左--右
3.2 中序
左--根--右
3.3 后序

左--右--根

#include <iostream>
using namespace std;
template <typename T>
struct binaryTreeNode
{
	//数据域
	T  element;
	//指针域
	binaryTreeNode<T>* leftChild;	//左子树指针
	binaryTreeNode<T>* rightChild;  //右子树指针
	//构造函数负责给基本数据成员初始化
	binaryTreeNode()
	{
		leftChild = rightChild = nullptr;
	}
	binaryTreeNode(const T& element) :element(element)
	{
		leftChild = rightChild = nullptr;
	}
	binaryTreeNode(const T& element, binaryTreeNode<T>* leftChild, binaryTreeNode<T>* rightChild)
	{
		this->element = element;
		this->leftChild = leftChild;
		this->rightChild = rightChild;
	}
};
template <typename T>
void printData(binaryTreeNode<T>* x)
{
	cout << x->element <<"\t";
}

template <typename T>
void preOrder(binaryTreeNode<T>* tree)
{
	//1.通过参数递推来产生递归
	//2.通过返回值得
	if (tree != nullptr)
	{
		printData(tree);  //打印数据
		preOrder(tree->leftChild);		//左
		preOrder(tree->rightChild);     //右
	}
}

template <typename T>
void midOrder(binaryTreeNode<T>* tree)
{
	if (tree != nullptr)
	{
		midOrder(tree->leftChild);		//左
		printData(tree);
		midOrder(tree->rightChild);     //右
	}
}

template <typename T>
void lastOrder(binaryTreeNode<T>* tree)
{
	if (tree != nullptr)
	{
		lastOrder(tree->leftChild);		//左
		lastOrder(tree->rightChild);     //右
		printData(tree);
	}
}


// 求树的深度

//删除树


int main()
{
	//普通数据,二叉树的存储
	binaryTreeNode<char> *G = new binaryTreeNode<char>('G');
	binaryTreeNode<char> *F = new binaryTreeNode<char>('F', nullptr, G);
	binaryTreeNode<char> *E = new binaryTreeNode<char>('E');
	binaryTreeNode<char> *D = new binaryTreeNode<char>('D');
	binaryTreeNode<char> *C = new binaryTreeNode<char>('C', F, nullptr);
	binaryTreeNode<char> *B = new binaryTreeNode<char>('B', D, E);
	binaryTreeNode<char> *A = new binaryTreeNode<char>('A', B, C);
	cout << "先序遍历:" << endl;
	preOrder(A);
	cout <<endl<< "中序遍历:" << endl;
	midOrder(A);
	cout <<endl<< "后序遍历:" << endl;
	lastOrder(A);


	system("pause");
	return 0;
}

点击链接加入群获取更多学习内容。


猜你喜欢

转载自blog.csdn.net/ydpawx/article/details/78634082
今日推荐