这里写自定义目录标题
数据结构输出从根到各个叶子节点的路径
从构建二叉树到输出根到各个叶子节点的路径
#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 100
typedef struct BTNode{
int data;
BTNode* lchild;
BTNode* rchild;
}BTNode;
//寻路
void findWay(BTNode *T,int a[],int d) { //a数组用来存储路径上的节点,d代表深度
if (T != NULL) {
a[d++] = T->data;
if (T->lchild == NULL && T->rchild == NULL) {
for (int i = 0; i < d; i++) {
cout << a[i] << ' ';
}
cout << endl;
return;
}
findWay(T->lchild, a, d);
findWay(T->rchild, a, d);
}
}
/*void addT(BTNode *T,int a) { //只往左半边添加节点
BTNode* bt = (BTNode*)malloc(sizeof(BTNode));
bt->data = a;
bt->lchild = NULL;
bt->rchild = NULL;
if (T->lchild == NULL) {
T->lchild = bt;
}
else if (T->rchild == NULL) {
T->rchild = bt;
}
else {
addT(T->lchild, a);
}
} */
void preOrder(BTNode* T) { //先序遍历
if (T != NULL) {
cout << T->data;
preOrder(T->lchild);
preOrder(T->rchild);
}
}
void inOrder(BTNode* T) { //中序遍历
if (T != NULL) {
inOrder(T->lchild);
cout << T->data;
inOrder(T->rchild);
}
}
/*void level(BTNode* T) { //层次遍历
BTNode* bt = T;
queue<BTNode*> q;
if (bt != NULL) {
q.push(bt);
}
while (!q.empty()) {
bt = q.front();
q.pop();
cout << bt->data;
if (bt->lchild != NULL) {
q.push(bt->lchild);
}
if (bt->rchild != NULL) {
q.push(bt->rchild);
}
}
}*/
void addE(BTNode* T, int a) { //以层次遍历的方式添加节点
queue<BTNode*> q; //创建一个队列,在层次遍历添加节点中使用
BTNode* bt = T;
BTNode* n;
if (bt != NULL) {
q.push(bt);
}
while(!q.empty()) {
bt = q.front();
q.pop();
if (bt->lchild == NULL) {
n = (BTNode*)malloc(sizeof(BTNode));
n->data = a;
n->lchild = NULL;
n->rchild = NULL;
bt->lchild = n;
return;
}
else if (bt->rchild == NULL) {
n = (BTNode*)malloc(sizeof(BTNode));
n->data = a;
n->lchild = NULL;
n->rchild = NULL;
bt->rchild = n;
return;
}
q.push(bt->lchild);
q.push(bt->rchild);
}
}
int main() {
int a[MAXSIZE];
BTNode* T = (BTNode*)malloc(sizeof(BTNode)); //根节点
T->data = 1;
T->lchild = NULL;
T->rchild = NULL;
for (int i = 2; i < 8; i++) { //创建一个二叉树
addE(T, i);
}
/* //已知先序遍历序列和中序遍历序列可以确定唯一的二叉树,用来检测二叉树构建是否正确
preOrder(T);
cout << endl;
inOrder(T);
cout << endl;
*/
findWay(T, a, 0);
}