建立完全二叉树,并且进行中序遍历(C++)

3 篇文章 0 订阅
3 篇文章 0 订阅
/*建立完全二叉树 并且输出中序遍历的结果 res为中序遍历的结果 
遍历方式是根据根节点的命名的,如中序,第二个访问根节点
前序遍历:根左右
中序遍历:左根右
后序遍历:左右根
*/


#include <stdio.h>
#include <queue>
#include <stack>
using namespace std;
class Node
{
public:
	int value;
	Node* Left;
	Node* Right;
};


class Tree
{
	Node *root;
public:
	void Insert(int value);
	Tree();
	void MidTra(queue<Node*> &res);
};
Tree::Tree()
{
	root = 0;
}



void Tree::Insert(int value)
{
	Node *node = new Node;
	node->value = value;
	node->Left = 0;
	node->Right = 0;

	if (root == 0)//空树
	{
		root = node;
	}
	else
	{
		queue<Node*> q;
		Node* temp = root;
		while (1)
		{
			if (temp->Left)
			{
				q.push(temp->Left);
				if (temp->Right)
				{
					q.push(temp->Right);
					temp = q.front();
					q.pop();
					continue;
				}
				else
				{
					temp->Right = node;
					return;
				}

			}
			else
			{
				temp->Left = node;
				return;
			}
		}
	}
}

void Tree::MidTra(queue<Node*> &res)
{
	if (!root)
	{
		return;
	}
	Node* temp = root;
	stack<Node*> s;
	while (1)
	{
		while (temp->Left)
		{
			s.push(temp);
			temp = temp->Left;
		}//找到最左下角的元素
		res.push(temp);//在这之前省去了两步,把左下角的放栈中再拿出来
		if (s.empty())//栈为空
		{
			return;
		}
		temp = s.top();
		s.pop();
		res.push(temp);
		if (temp->Right)
		{
			temp = temp->Right;
		}
		else
		{
			temp = s.top();
			s.pop();
			res.push(temp);
			temp = temp->Right;
		}
	}
}
int main()
{
	Tree tree;
	printf("请输入根的深度:");
	int N = 0;
	scanf("%d", &N);
	int num = 0;
	
	printf("请依次输入节点值:\n");
	for (int i=0;i<(pow(2,N)-1);++i)
	{
		scanf("%d", &num);
		tree.Insert(num);
	}
	queue<Node*> res;
	tree.MidTra(res);
	return 0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值