二叉树垂直遍历 java_【004】二叉树垂直遍历
二叉樹垂直遍歷
題目描述
輸入輸出
示例輸入
實例輸出
DFS
BFS
更簡單的方法
二叉樹垂直遍歷
題目描述
對于一個二叉樹,輸出它的垂直遍歷結果;對于同一列的節點,按照從左向右,從上向下的順序排列。
例如,對于以下二叉樹:
1
/ \
2 3
/
4
垂直遍歷的結果是:2 1 4 3
輸入輸出
輸入
- 第一行是n,表示節點個數(節點編號從0到n-1);當n=-1時,表示輸入結束
- 之后的n行,每一行有三個整數,分別表示:節點的數值,左子樹的編號,右子樹的編號(編號-1表示節點為空)
輸出
- 針對每組輸入,輸出垂直遍歷的結果
示例輸入
4
1 1 2
2 -1 -1
3 3 -1
4 -1 -1
-1
實例輸出
2 1 4 3
DFS
#include
#include
#include
#include
#include
#include
using namespace std;
struct Node {
int data;
Node *left;
Node *right;
};
class TreePrint {
private:
map > nmap;
public:
void dfs(Node *root, int pos) {
if (root == NULL) return;
nmap[pos].push_back(root->data);
dfs(root->left, pos-1);
dfs(root->right, pos+1);
}
void display() {
int min=0;
while (nmap.find(min) != nmap.end()) --min;
for (int i=min+1; nmap.find(i) != nmap.end(); ++i)
for (vector::iterator it = nmap[i].begin();
it != nmap[i].end(); ++it)
printf("%d ", *it);
printf("\n");
}
};
int main() {
ifstream in("../input.txt");
int n;
in >> n;
while (n != -1) {
Node *tree = new Node[n];
for (int i=0; iint tmp, left, right;
in >> tmp >> left >> right;
tree[i].data = tmp;
if (left != -1) tree[i].left = &tree[left];
else tree[i].left = NULL;
if (right != -1) tree[i].right = &tree[right];
else tree[i].right = NULL;
}
TreePrint tp;
tp.dfs(&tree[0], 0);
tp.display();
in >> n;
}
in.close();
return 0;
}
然而這個結果并不正確,不能妥善的處理孩子節點超過父節點的深度的情況。
BFS
#include
#include
#include
#include
#include
#include
using namespace std;
struct Node {
int data;
Node *left;
Node *right;
};
class TreePrint {
private:
map > nmap;
public:
void dfs(Node *root, int pos) {
if (root == NULL) return;
nmap[pos].push_back(root->data);
dfs(root->left, pos-1);
dfs(root->right, pos+1);
}
void bfs(Node *root) {
queue q;
queue qpos;
q.push(root);
qpos.push(0);
while (!q.empty()) {
Node *tmp = q.front();
int pos = qpos.front();
q.pop();
qpos.pop();
nmap[pos].push_back(tmp->data);
if (tmp->left != NULL) {
q.push(tmp->left);
qpos.push(pos-1);
}
if (tmp->right != NULL) {
q.push(tmp->right);
qpos.push(pos+1);
}
}
}
void display() {
int min=0;
while (nmap.find(min) != nmap.end()) --min;
for (int i=min+1; nmap.find(i) != nmap.end(); ++i)
for (vector::iterator it = nmap[i].begin();
it != nmap[i].end(); ++it)
printf("%d ", *it);
printf("\n");
}
};
int main() {
ifstream in("../input.txt");
int n;
in >> n;
while (n != -1) {
Node *tree = new Node[n];
for (int i=0; iint tmp, left, right;
in >> tmp >> left >> right;
tree[i].data = tmp;
if (left != -1) tree[i].left = &tree[left];
else tree[i].left = NULL;
if (right != -1) tree[i].right = &tree[right];
else tree[i].right = NULL;
}
TreePrint tp;
tp.bfs(&tree[0]);
tp.display();
in >> n;
}
in.close();
return 0;
}
更簡單的方法
由于輸入的時候就是BFS遍歷,所以輸入的時候就可以進行排序
#include
#include
#include
#include
using namespace std;
struct Node {
int data;
int id;
int colum;
};
bool compareTo(Node &l, Node &r) {
if (l.colum == r.colum) return l.id < r.id;
else return l.colum < r.colum;
}
int main() {
ifstream in("../input.txt");
int n;
in >> n;
while (n != -1) {
queue q;
q.push(0);
Node *tree = new Node[n];
tree[0].colum = 0;
for (int i=0; iint tmp, left, right;
in >> tmp >> left >> right;
tree[i].data = tmp;
tree[i].id = i;
int pos = q.front();
q.pop();
if (left != -1) {
tree[left].colum = pos - 1;
q.push(pos-1);
}
if (right != -1) {
tree[right].colum = pos + 1;
q.push(pos+1);
}
}
sort(tree, tree+n, &compareTo);
for (int i=0; iprintf("%d ", tree[i].data);
}
printf("\n");
in >> n;
}
in.close();
return 0;
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的二叉树垂直遍历 java_【004】二叉树垂直遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多线程面试题系列(12):多线程同步内功
- 下一篇: 【航空订票系统——开题报告 分享(仅供参