按层次遍历二叉树
编写按层次顺序(同一层自左至右)遍历二叉树的算法。
#include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;
struct BiNOde
{
int ele;
BiNOde* lnode;
BiNOde* rnode;
};
vector<vector<int>>aa;
BiNOde*p;
BiNOde*root;
void findparent(BiNOde*node, BiNOde*parent)
{
if (parent == NULL)
return;
if (parent->lnode == node || parent->rnode == node)
{
p = parent;
return;
}
findparent(node, parent->lnode);
findparent(node, parent->rnode);
}
int depth_of_node(BiNOde*node)
{
int k = 0;
if (node == root)
return 0;
BiNOde*n = node;
while (n != root)
{
findparent(n, root);
n = p;
k++;
}
return k;
}
void PreOrderTraverse(BiNOde*node)
{
if (node == NULL)
return;
int d = depth_of_node(node);
if (d + 1 > aa.size())
{
vector<int>a;
a.push_back(node->ele);
aa.push_back(a);
}
else
{
vector<int>a=aa[d];
a.push_back(node->ele);
aa[d] = a;
}
if (node->lnode != NULL)
PreOrderTraverse(node->lnode);
if (node->rnode != NULL)
PreOrderTraverse(node->rnode);
}
BiNOde*create_tree()
{
BiNOde * root = new BiNOde;
BiNOde*node1 = new BiNOde;
BiNOde*node2 = new BiNOde;
BiNOde*node3 = new BiNOde;
BiNOde*node4 = new BiNOde;
BiNOde*node5 = new BiNOde;
BiNOde*node6 = new BiNOde;
BiNOde*node7 = new BiNOde;
BiNOde*node8 = new BiNOde;
BiNOde*node9 = new BiNOde;
BiNOde*node10 = new BiNOde;
BiNOde*node11 = new BiNOde;
root->ele = 0;
node1->ele = 1;
node2->ele = 2;
node3->ele = 3;
node4->ele = 4;
node5->ele = 5;
node6->ele = 6;
node7->ele = 7;
node8->ele = 8;
node9->ele = 9;
node10->ele = 10;
node11->ele = 11;
root->lnode = node1;
root->rnode = node2;
node1->lnode = node3;
node1->rnode = node4;
node2->lnode = node7;
node2->rnode = node8;
node3->lnode = node5;
node3->rnode = node11;
node4->lnode = node10;
node4->rnode = NULL;
node5->lnode = node6;
node5->rnode = NULL;
node6->lnode = NULL;
node6->rnode = NULL;
node7->lnode = node9;
node7->rnode = NULL;
node8->lnode = NULL;
node8->rnode = NULL;
node9->lnode = NULL;
node9->rnode = NULL;
node10->lnode = NULL;
node10->rnode = NULL;
node11->lnode = NULL;
node11->rnode = NULL;
//BiNOde*node12 = new BiNOde;
//node12->ele = 12;
//node12->lnode = NULL;
//node12->rnode = NULL;
//node6->lnode = node11;
return root;
}
int _tmain(int argc, _TCHAR* argv[])
{
root = create_tree();
PreOrderTraverse(root);
system("pause");
return 0;
}
先序遍历一遍tree,同一深度的节点访问的顺序虽然不是连续的,但是却满足从左到右的顺序,只需将同以深度的节点依次存到一个数组即可。
在main函数的system("pause")这一句设置断点,将全局变量aa添加监视,运行到system这一句暂停的时候观察aa中存放的数据,结果正确。
版权声明:
浙公网安备 33010602011771号