C++实现二叉树及相关操作

二叉树的定义:是一种树形结构,特点是每个节点最多有两棵子树并且有左右之分

二叉树的五种形态:空树,只有一个根,一个根和一个左子树,一个根和一个右子树,根和左右子树

二叉树的特性:1.第i层最多有2的(i-1)次方个节点

                         2.深度为h的二叉树最多有2的(h-1)次方个节点

                         3.对一个完全二叉树进行顺序编号,对于编号为i的结点,i=1,为根;i%2=0说明                                有该结点的父节点有一个左子树,i%2>0说明有左右子树

四种遍历方式:先序遍历,中序遍历,后序遍历根据根节点的遍历顺序区分,层序遍历

代码实现:

首先构造两个类,一个二叉树类,一个结点类,列出函数声明

class Node
{
public:
	Node() :m_left(nullptr), m_right(nullptr) {}
	Node(char v) :m_value(v), m_left(nullptr), m_right(nullptr) {}
	char m_value; //节点的值
	Node* m_left; //指向左子树的指针
	Node* m_right; //指向右子树的指针
};
class Tree
{
public:
	Tree() :m_root(NULL) {}
	Node* Create1(const char*& str);//1.创建二叉树
	void Create(Node*& root, const char*& str);//2.创建二叉树的递归写法
	void PreOrder(Node* root);//3.先序遍历
	void InOrder(Node* root);//4.中序遍历
	void PostOrder(Node* root);//5.后序遍历
	int Size(Node* root);//6.求节点个数
	int Height(Node* root);//7.求树的深度
	Node* Search(Node* root, char v);//8.查找二叉树中是否存在该节点
	Node* Parent(Node* root, char v);//9.查找该结点的父亲节点
	Node* m_root;//二叉树的根节点
};

1.创建二叉树

Node *Tree::Create1(const char*& str)
{
    if(*str=='#')
      return nullptr;
    else
    {
       Node* root=new Node(*str);
       root->m_left=Create1(++str);
       root->m_right=Create1(++str);
       return root;
     }
}

2.创建二叉树(递归)

void Tree::Create(Node*& root,const char*& str)
{
    if(*str=='#')
      root=nullptr;
    else
    {
      root =new Node(*str);
      Create(root->m_left,++str);
      Create(root->m_right,++str);
      return root;
    }
}

3.先序遍历(根左右)

void Tree::PreOrder(Node* root)
{
	if (root != nullptr)
	{
		cout << root->m_value << " ";
		PreOrder(root->m_left);
		PreOrder(root->m_right);
	}
}

4.中序遍历(左根右)

void Tree::InOrder(Node* root)
{
	if (root != nullptr)
	{
		InOrder(root->m_left);
		cout << root->m_value << " ";
		InOrder(root->m_right);
	}
}

5.后序遍历(左右根)

void Tree::PostOrder(Node* root)
{
	if (root != nullptr)
	{
		PostOrder(root->m_left);
		PostOrder(root->m_right);
		cout << root->m_value << " ";
	}
}

6.求节点个数

int Tree::Size(Node* root)
{
	if (root == nullptr)
		return 0;
	else
		return Size(root->m_left) + Size(root->m_right) + 1;
}


7.求树的深度

int Tree::Height(Node* root)
{
	if (root == nullptr)
		return 0;
	else
	{
		int L = Height(root->m_left);
		int R = Height(root->m_right);
		return L > R ? (L + 1) : (R + 1);
	}
}


8.查找二叉树中是否存在该节点

Node* Tree::Search(Node* root, char v)
{
	Node* p = nullptr;
	if (root == nullptr)
		return nullptr;
	if (root->m_value == v)
		return root;
	p = Search(root->m_left, v);//递归循环它的左子树
	if (p != nullptr)
		return p;
	return Search(root->m_right, v);//左子树没找到就递归循环右子树
}


9.查找该结点的父亲节点

Node* Tree::DadSearch(Node* root, char v)
{
	Node* end = nullptr;
	if (root == nullptr)
		end = nullptr;
	if (root->m_left != nullptr && root->m_left->m_value == v)
		end = root;
	if (root->m_right != nullptr && root->m_right->m_value == v)
		end = root;
	return end;
}

主函数

void main()
{
	//Node* p = new Node('a');
	Tree t;
	const char* str = "ABDG##I###CE#J##F##";
	t.m_root = t.Create1(str);
	//t.Create(t.m_root, str);
	cout << "PreOrder:";
	t.PreOrder(t.m_root);
	cout << endl;
	cout << "InOrder:";
	t.InOrder(t.m_root);
	cout << endl;
	cout << "PostOrder:";
	t.PostOrder(t.m_root);
	cout << endl;
	cout << "size = " << t.Size(t.m_root) << endl;
	cout << "height = " << t.Height(t.m_root) << endl;
	Node* p = t.Search(t.m_root, 'A');
	if (p)
	{
		cout << p->m_value << endl;
	}
	else
	{
		cout << "没找到" << endl;
	}
    p = t.DadSearch(t.m_root, 'C');
	if (p)
	{
		cout << p->m_value << endl;
	}
	else
	{
		cout << "没找到" << endl;
	}
}

运行结果:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Better Sally

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值