#include<iostream> #include<string> #include<vector> #include<iomanip> #include<stdlib.h> #include <stdio.h> using namespace std; const int MaxSize = 100; typedef struct tnode { char data; struct tnode *lchild, *rchild; }BTNode; /************************************** *查找叶子结点到根结点的路径 **************************************/ void AllPath(BTNode *b, char path[], int pathlen) { int i; if(b != NULL) { if(b->lchild == NULL && b->rchild == NULL) { cout << " " << b->data << "到根结点路径" << b->data; for(i = pathlen - 1; i >= 0; i--) cout << " " << path[i]; cout << endl; } else { path[pathlen] = b->data; pathlen++; AllPath(b->lchild, path, pathlen); AllPath(b->rchild, path, pathlen); pathlen--; //恢复环境 } } } /*************************************** * 建立二叉链 ***************************************/ void CreateBTree(BTNode * &bt, char *str) { BTNode *St[MaxSize], *p = NULL; int top = -1, k, j = 0; char ch; bt = NULL; ch = str[j]; while(ch != '/0') //str未扫描完时循环 { switch(ch) { case '(': top++; St[top] = p; k = 1; break; case ')': top--; break; case ',': k = 2; break; default: p = (BTNode *)malloc(sizeof(BTNode)); p->data = ch; p->lchild = p->rchild = NULL; if(bt == NULL) bt = p; else { switch(k) { case 1: St[top]->lchild = p; break; case 2: St[top]->rchild = p; break; } } } j++; ch = str[j]; } } /****************************************** *用括号法输出二叉链 *******************************************/ void DispBTree(BTNode *bt) { if(bt != NULL) { cout << bt->data; if(bt->lchild != NULL || bt->rchild != NULL) { cout << "("; DispBTree(bt->lchild); if(bt->rchild != NULL) cout << ","; DispBTree(bt->rchild); cout << ")"; } } } void main() { BTNode *b; char path[MaxSize]; CreateBTree(b, "A(B(D,E(G,H)),C(,F(I)))");//建立二叉树 cout << "括号表示法: "; DispBTree(b); //用括号法输出二叉树 cout << "/n输出叶结点路径:/n"; AllPath(b, path, 0); }