描述
给一个二叉树,打印其所有路径
思路:
利用后序非递归遍历,因为后序非递归遍历的特性,对于每次访问的节点,栈里面存的元素都是当前节点的祖先,所以只要判断当前节点是不是叶子节点,如果是叶子节点,那么将栈中元素取出,和当前叶子节点组成一条路径。
#include <bits/stdc++.h>
using namespace std;
struct Node {
char data;
Node* left;
Node* right;
Node(char x):data(x),left(nullptr),right(nullptr){}
Node(){}
};
Node* build() {
Node* root = nullptr;
char x;
x = getchar();
if (x != '#') {
root = new Node(x);
root->left = build();
root->right = build();
}
return root;
}
void visit(Node* p) {
cout << p->data << " ";
}
void postVis(Node* root) {
if (root) {
postVis(root->left);
postVis(root->right);
visit(root);
}
}
void postOrderVis(Node* root) {
stack<pair<Node*,int>>st;
Node* p = root;
vector<vector<char>>A; //记录所有路径
vector<char>tmp;//记录当前路径
while(!st.empty() || p) {
if (p) {
st.push(make_pair(p,1));
tmp.push_back(p->data);
p = p->left;
}
else {
auto now = st.top();
st.pop();
tmp.pop_back();
if (now.second == 1) {
now.second = 2;
st.push(now);
tmp.push_back(now.first->data);
p = now.first->right;
}
else {
if (now.first->left == nullptr && now.first->right == nullptr) { //判断是否是叶子节点
tmp.push_back(now.first->data);
A.push_back(tmp);
tmp.pop_back();
}
visit(now.first);
}
}
}
cout << endl;
for (int i = 0; i < (int)A.size(); ++i) {
for (int j = 0; j < (int)A[i].size(); ++j) {
cout << A[i][j] << " ";
}
cout << endl;
}
}
void solve() {
Node* root = build();
postOrderVis(root);
cout << endl;
postVis(root);
}
int main() {
solve();
return 0;
}
/*
ABDG###E#H##CF###
*/
/* 树的结构
A
/ \
B C
/ \ /
D E F
/ \
G H
*/