每日一题之 非递归后序遍历打印二叉树所有路径

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014046022/article/details/83184202

描述

给一个二叉树,打印其所有路径

思路:

利用后序非递归遍历,因为后序非递归遍历的特性,对于每次访问的节点,栈里面存的元素都是当前节点的祖先,所以只要判断当前节点是不是叶子节点,如果是叶子节点,那么将栈中元素取出,和当前叶子节点组成一条路径。

#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
*/

猜你喜欢

转载自blog.csdn.net/u014046022/article/details/83184202