数据结构--二叉树

一、二叉树:

1.二叉树是树的一种特殊的形式,每个结点的度最大为2,且有左右之分。

2.性质:

  1. 非空二叉树第 i 层最多 2(i-1) 个结点 (i >= 1)
  2. 深度为 k 的二叉树最多 2k - 1 个结点 (k >= 1)
  3. 度为 0 的结点数为 n0,度为 2 的结点数为 n2,则 n0 = n2 + 1
  4. 有 n 个结点的完全二叉树深度 k = ⌊ log2(n) ⌋ + 1
  5. 对于含 n 个结点的完全二叉树中编号为 i (1 <= i <= n) 的结点
    1. 若 i = 1,为根,否则双亲为 ⌊ i / 2 ⌋
    2. 若 2i > n,则 i 结点没有左孩子,否则孩子编号为 2i
    3. 若 2i + 1 > n,则 i 结点没有右孩子,否则孩子编号为 2i + 1

3.存储方式:顺序存储(编号),链式存储(二叉链表)

二、实现(C++):

1.定义二叉结点:

struct BiTreeNode {
	char data;
	BiTreeNode *lchild;
	BiTreeNode *rchild;
};

2.定义二叉树的类:

class BiTree {
public:
    void Init();
    //递归前序遍历
    void PreOrderTraverse1();    
    //非递归前序遍历
    void PreOrderTraverse2();   
    //递归中序遍历
    void InOrderTraverse1();
    //非递归中序遍历
    void InOrderTraverse2();
    //递归后序遍历
    void PostOrderTraverse1();
    //非递归后序遍历
    void PostOrderTraverse2();
    //先序创建二叉树
    void CreateBiTree();

private:
    BiTreeNode *root;
    void PreOrder_Traverse1(BiTreeNode *r);
    void PreOrder_Traverse2(BiTreeNode *r);
    void InOrder_Traverse1(BiTreeNode *r);
    void InOrder_Traverse2(BiTreeNode *r);
    void PostOrder_Traverse1(BiTreeNode *r);
    void PostOrder_Traverse2(BiTreeNode *r);
    void Create_BiTree(BiTreeNode **r);
};

3.完整代码:

/*
*通过二叉链表实现了二叉树的先序创建,三种遍历的递归和非递归方法
*/
#include<iostream>
#include<stack>

using namespace std;

//树结点类型:二叉链表
struct BiTreeNode {
	char data;
	BiTreeNode *lchild;
	BiTreeNode *rchild;
};

//二叉树的类
class BiTree {
public:
	void Init();
	//递归前序遍历
	void PreOrderTraverse1();    
	//非递归前序遍历
	void PreOrderTraverse2();   
	//递归中序遍历
	void InOrderTraverse1();
	//非递归中序遍历
	void InOrderTraverse2();
	//递归后序遍历
	void PostOrderTraverse1();
    //先序创建二叉树
	void CreateBiTree();

private:
	BiTreeNode *root;
	void PreOrder_Traverse1(BiTreeNode *r);
	void PreOrder_Traverse2(BiTreeNode *r);
	void InOrder_Traverse1(BiTreeNode *r);
	void InOrder_Traverse2(BiTreeNode *r);
	void PostOrder_Traverse1(BiTreeNode *r);
	void Create_BiTree(BiTreeNode **r);
};

//初始化二叉树
void BiTree::Init()
{
	root = nullptr;
}

//递归的前序遍历
void BiTree::PreOrder_Traverse1(BiTreeNode *r)
{
	if (r)
	{
		cout << r->data << " ";
		PreOrder_Traverse1(r->lchild);
		PreOrder_Traverse1(r->rchild);
	}
}
void BiTree::PreOrderTraverse1()
{
	PreOrder_Traverse1(root);
	cout << endl;
}

//非递归前序遍历
void BiTree::PreOrder_Traverse2(BiTreeNode *r)
{
	stack<BiTreeNode*> s1;
	s1.push(r);
	BiTreeNode *p, *q;
	while (!s1.empty())
	{
		while ((p = s1.top()) && p)
		{
			cout << p->data << " ";
			s1.push(p->lchild);
		}
		s1.pop();
		if (!s1.empty())
		{
			q = s1.top();
			s1.pop();
			s1.push(q->rchild);
		}
	}

}
void BiTree::PreOrderTraverse2()
{
	PreOrder_Traverse2(root);
	cout << endl;
}

//递归的中序遍历
void BiTree::InOrder_Traverse1(BiTreeNode *r)
{
	if (r)
	{
		InOrder_Traverse1(r->lchild);
		cout << r->data << " ";
		InOrder_Traverse1(r->rchild);
	}
}
void BiTree::InOrderTraverse1()
{
	InOrder_Traverse1(root);
	cout << endl;
}

//非递归的中序遍历
void BiTree::InOrder_Traverse2(BiTreeNode *r)
{
	stack<BiTreeNode*> s1;
	BiTreeNode *q,*p;
	s1.push(r);
	while (!s1.empty())
	{
		while ((q = s1.top()) && q)
			s1.push(q->lchild);
		s1.pop();
		if (!s1.empty())
		{
			p = s1.top();
			cout << p->data<<" ";
			s1.pop();
			s1.push(p->rchild);
		}
	}
}
void BiTree::InOrderTraverse2()
{
	InOrder_Traverse2(root);
	cout << endl;
}

//递归的后序遍历
void BiTree::PostOrder_Traverse1(BiTreeNode *r)
{
	if (r)
	{
		PostOrder_Traverse1(r->lchild);
		PostOrder_Traverse1(r->rchild);
		cout << r->data << " ";
	}
}
void BiTree::PostOrderTraverse1()
{
	PostOrder_Traverse1(root);
	cout << endl;
}

//递归实现先序创建二叉树
void BiTree::Create_BiTree(BiTreeNode **r)
{
	
	char e;
	cin >> e;
	if (e == '#')
		r = NULL;
	else
	{
		*r = new BiTreeNode();
		(*r)->data = e;
		Create_BiTree(&(*r)->lchild);
		Create_BiTree(&(*r)->rchild);
	}
}
void BiTree::CreateBiTree()
{
	Create_BiTree(&root);
}

int main()
{
	BiTree T1;
	T1.Init();
	T1.CreateBiTree();
	cout << "前序遍历序列为: " << endl;
	T1.PreOrderTraverse1();
	T1.PreOrderTraverse2();
	cout << "中序遍历序列为: " << endl;
	T1.InOrderTraverse1();
	T1.InOrderTraverse2();
	cout << "后序遍历序列为: " << endl;
	T1.PostOrderTraverse1();
	return 0;
}

三、运行结果:

全部评论

相关推荐

牛客929910204号:千万别写熟练掌握word/ppt,一看就水
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务