/*建立完全二叉树 并且输出中序遍历的结果 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;
}
建立完全二叉树,并且进行中序遍历(C++)
于 2019-09-09 21:47:04 首次发布