编程之美读书笔记-分层遍历二叉树

1
2 3
4 5 6
7 8

struct Node
{
Node *lChild;
Node *rChild;
int data;
};

int PrintNodeAtLevel(Node* root, int level)
{
if (!root || level < 0) return 0;
if (level == 0)
{
cout << root->data << endl;
return 1;
}
return PrintNodeAtLevel(root->lChild, level - 1) + PrintNodeAtLevel(root->rChild, level - 1);
}


#include<iostream>
using namespace std;

struct Node
{
Node *lChild;
Node *rChild;
int data;
};

void Link(Node* nodes, int parent, int left, int right)
{
if (left != -1)
nodes[parent].lChild = &nodes[left];
if (right != -1)
nodes[parent].rChild = &nodes[right];
}

int PrintNodeAtLevel(Node* root, int level)
{
if (!root || level < 0) return 0;
if (level == 0)
{
cout << root->data << " ";
return 1;
}
return PrintNodeAtLevel(root->lChild, level - 1) + PrintNodeAtLevel(root->rChild, level - 1);
}

void PrintNodeByLevel(Node* root)
{
for (int level=0 ; ; level++)
{
if (!PrintNodeAtLevel(root, level)) break;
cout << endl;
}
}

int main()
{
Node nodes[9] = { 0 };
for (int i = 1; i < 9; i++) nodes[i].data = i;
PrintNodeByLevel(&nodes[1]);
}

#include<vector>
#include<iostream>
using namespace std;

struct Node
{
Node *lChild;
Node *rChild;
int data;
};

void Link(Node* nodes, int parent, int left, int right)
{
if (left != -1)
nodes[parent].lChild = &nodes[left];
if (right != -1)
nodes[parent].rChild = &nodes[right];
}

void PrintNodeByLevel(Node* root)
{
vector<Node*> vec;
vec.push_back(root);
int cur = 0;
int last = 1;
while (cur < vec.size())
{
last = vec.size();
// 新的一行访问开始，重新定位last于当前行最后一个节点的下一个位置
while (cur < last)
{
cout << vec[cur]->data << " ";
// 访问节点
if (vec[cur]->lChild) // 当前访问节点的左节点不为空则压入
vec.push_back(vec[cur]->lChild);
if (vec[cur]->rChild) // 当前访问节点的右节点不为空则压入
vec.push_back(vec[cur]->rChild);
cur++;
}
cout << endl;
// 当cur == last时,说明该层访问结束，输出换行符
}
}

int main()
{
Node nodes[9] = { 0 };
for (int i = 1; i < 9; i++) nodes[i].data = i;
PrintNodeByLevel(&nodes[1]);
}

#include<queue>
#include<iostream>
using namespace std;

struct Node
{
Node *lChild;
Node *rChild;
int data;
};

void Link(Node* nodes, int parent, int left, int right)
{
if (left != -1)
nodes[parent].lChild = &nodes[left];
if (right != -1)
nodes[parent].rChild = &nodes[right];
}

void PrintNodeByLevel(Node* root)
{
deque<Node*> Q1, Q2;
Q1.push_back(root);
do {
do {
Node* node = Q1.front();
Q1.pop_front();
cout << node->data << " ";
if (node->lChild)
Q2.push_back(node->lChild);
if (node->rChild)
Q2.push_back(node->rChild);
} while (!Q1.empty());
cout << endl;
Q1.swap(Q2);
} while (!Q1.empty());
}

int main()
{
Node nodes[9] = { 0 };
for (int i = 1; i < 9; i++) nodes[i].data = i;
PrintNodeByLevel(&nodes[1]);
}

#include<queue>
#include<iostream>
using namespace std;

struct Node
{
Node *lChild;
Node *rChild;
int data;
};

void Link(Node* nodes, int parent, int left, int right)
{
if (left != -1)
nodes[parent].lChild = &nodes[left];
if (right != -1)
nodes[parent].rChild = &nodes[right];
}

void PrintNodeByLevel(Node* root)
{
queue<Node*> Q;
Q.push(root);
Q.push(0);
do
{
Node* node = Q.front();
Q.pop();
if (node)
{
cout << node->data << " ";
if (node->lChild)
Q.push(node->lChild);
if (node->rChild)
Q.push(node->rChild);
}
else if (!Q.empty())
{
Q.push(0);
cout << endl;
}
} while (!Q.empty());
}

int main()
{
Node nodes[9] = { 0 };
for (int i = 1; i < 9; i++) nodes[i].data = i;
PrintNodeByLevel(&nodes[1]);
}

• 本文已收录于以下专栏：

《编程之美》——分层遍历二叉树

• zengzhen_CSDN
• 2015年11月16日 19:28
• 336

编程之美读书笔记 分层遍历二叉树

• wangzhewang
• 2011年10月02日 19:53
• 705

编程之美读书笔记---分层遍历二叉树

• xiaozhuaixifu
• 2013年07月20日 13:28
• 894

编程之美读书笔记_3.10 分层遍历二叉树

3.10 分层遍历二叉树 看到Milo写的这篇文章，又翻了下书，发现书的代码（P253）有个瑕疵，每个节点值后面都会显示一个空格，如果将间隔字符改为“-”，输出的每行最后都有一个“-”，不能达到要求。...
• flyinghearts
• 2010年05月25日 23:55
• 1471

编程之美读书笔记-2 分层遍历二叉树

• linfeng24
• 2014年06月25日 23:55
• 609

[编程之美3.10]分层遍历二叉树

• qingmarch
• 2013年04月12日 23:11
• 329

编程之美 - 分层遍历二叉树

• wangzhiyu1980
• 2016年10月31日 15:46
• 734

[编程之美]分层遍历二叉树

• a83610312
• 2013年01月29日 14:29
• 461

[编程之美] 分层遍历二叉树

• sophistcxf
• 2013年08月01日 16:58
• 680

编程之美——3.10 分层遍历二叉树

• Ididcan
• 2012年09月16日 21:56
• 942

举报原因： 您举报文章：编程之美读书笔记-分层遍历二叉树 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)