二叉树的基本操作(1)

结点类型

struct TreeNode
{
	char val;
	struct TreeNode *l, *r;
	TreeNode(int x) :val(x), l(nullptr), r(nullptr)
	{

	}
};

新建一个类,名为solution,相关函数都放在这里面调用。

class solution
{
public:
//以下存放各大函数
}

首先先序创建一颗二叉树,上文写到结点类型为char。我们输入相关字母,若为空则输入#。需要注意的是,我们需要输入一个完整的先序序列,输入完成后回车即可。例如我在下图所画的那副二叉树,其完整的先序遍历就是:ABDH##I##E#J##CF#K##G##。

	void create(TreeNode* &root)//先序创建二叉树
	{
		char ch;
		cin >> ch;
		if (ch == '#')
		{
			root = nullptr;
		}
		else
		{
			root = (TreeNode *)malloc(sizeof(TreeNode));
			root->val = ch;
			create(root->l);
			create(root->r);
		}
	}

在遍历之前放上我的图片,供大家参考。
在这里插入图片描述

递归遍历:
先序:根节点、左节点、右节点
中序:左节点、根节点、右节点
后序:左节点、右节点、根节点

	void pre(TreeNode* &root)//递归先序
	{
		if (root != nullptr)
		{
			cout << root->val << "  ";
			pre(root->l);
			pre(root->r);
		}
	}

	void in(TreeNode* &root)//递归中序
	{
		if (root != nullptr)
		{
			in(root->l);
			cout << root->val << "  ";
			in(root->r);
		}
	}

	void post(TreeNode* &root)//递归后序
	{
		if (root != nullptr)
		{
			post(root->l);
			post(root->r);
			cout << root->val << "  ";
		}
	}

迭代遍历:

	void NLR(TreeNode* &root)//迭代先序
	{
		stack<TreeNode *> ret;
		TreeNode *p = root;
		while (p != nullptr || !ret.empty())
		{
			if (p != nullptr)//边遍历边打印,并存入栈中,以后需要借助这些根节点进入右子树
			{
				cout << p->val << "  ";
				ret.push(p);
				p = p->l;
			}
			else              //当p为空时,说明根和左子树都遍历完了,该进入右子树了
			{
				p = ret.top();//得到栈顶的根节点
				ret.pop();	  //出栈
				p = p->r;	  //访问右子树
			}
		}
	}

	void LNR(TreeNode* &root)//迭代中序
	{
		stack<TreeNode *> ret;
		TreeNode *p = root;
		while (p != nullptr || !ret.empty())
		{
			if (p != nullptr)
			{
				ret.push(p);//根指针入栈
				p = p->l;   //遍历左子树
			}
			else
			{
				p = ret.top();			//得到栈顶结点
				ret.pop();				//出栈

				cout << p->val << "  "; //访问根节点
				p = p->r;			    //遍历右子树
			}
		}
	}

	void LRN(TreeNode* &root)//迭代后序
	{
		stack<TreeNode *> ret1, ret2;
		TreeNode *p = root;
		while (p != nullptr || !ret2.empty())
		{
			if (p != nullptr)
			{
				ret1.push(p);
				ret2.push(p);
				p = p->r;
			}
			else
			{
				p = ret2.top();
				ret2.pop();
				p = p->l;
			}
		}
		while (!ret1.empty())
		{
			p = ret1.top();
			ret1.pop();
			cout << p->val << "  ";
		}
	}

层次遍历

	void level(TreeNode* &root)//层次遍历(类似于广度优先遍历)
	{
		queue<TreeNode *> ret;
		TreeNode *p = root;
		if (p != nullptr)
		{
			ret.push(p);
			while (!ret.empty())
			{
				p = ret.front();
				cout << p->val << "  ";
				ret.pop();
				if (p->l != nullptr)
				{
					ret.push(p->l);
				}
				if (p->r != nullptr)
				{
					ret.push(p->r);
				}
			}
		}
	}

主函数中调用这些函数。

int main()//ABDH##I##E#J##CF#K##G##
{
	TreeNode *root = nullptr;

	solution ss;
	cout << "先序输入元素创建二叉树,若元素为空则输入'#':"; ss.create(root);
	cout << "递归先序:"; ss.pre(root); cout << endl;
	cout << "递归中序:"; ss.in(root); cout << endl;
	cout << "递归后序:"; ss.post(root); cout << endl << endl;

	cout << "迭代先序:"; ss.NLR(root); cout << endl;
	cout << "迭代中序:"; ss.LNR(root); cout << endl;
	cout << "迭代后序:"; ss.LRN(root); cout << endl << endl;

	cout << "层次遍历:"; ss.level(root); cout << endl;

	_getch();
	return 0;
}

最后奉上运行截图
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

孤独的根号三号程序员

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

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

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

打赏作者

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

抵扣说明:

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

余额充值