/
试题描述
采用用户输入元素并基于后序遍历的方式创建一个包含6个节点的二叉链表树,基于遍历和交换,确保任何父节点的元素值不小于子节点。要求在遍历函数中采用函数指针。采用后序的方法输出二叉树的节点
样例输出
…CFD…BEA
样例输出
F D B E C A 应该是反了,正确是A C E B D F
这道题的难点是需要从叶子节点进行回溯比较,我还没有想到比较简单的做法,欢迎交流。
算法思路:
1.后序建立二叉树,
2.把二叉树转变为最大堆进行调整,
3.后序遍历输出。
#include <iostream>
#include <cstdlib>
#include <stack>
using namespace std;
typedef struct TreeNode *Tree;
typedef char ElementType;
stack<char> sta;
struct TreeNode {
ElementType Element;
Tree Left;
Tree Right;
};
typedef struct node{ //最大堆结构
char array[100];
int capacity;
int size;
}Maxtree;
Maxtree createHeap(){ //初始化最大堆
Maxtree tmp;
tmp.array[0]=97; //哨兵
tmp.capacity=100;
tmp.size=1;
return tmp;
}
Maxtree MaxHeap=createHeap();
Tree CreateTree() { //后序建立二叉树
char c = sta.top();
sta.pop();
Tree T = (Tree)malloc(sizeof(struct TreeNode));
if (c == '.') {
T = NULL;
} else {
T->Right = CreateTree();
T->Left = CreateTree();
T->Element = c;
}
return T;
}
Maxtree insertHeap(Maxtree tmp,char c){ //最大堆插入
int t=tmp.size++;
if (t>tmp.capacity) return tmp;
while(tmp.array[t/2]<c){
tmp.array[t]=tmp.array[t/2];
t=t/2;
}
tmp.array[t]=c;
return tmp;
}
void Transform(Tree T) { //二叉树调整成最大堆
if (!T) return;
MaxHeap=insertHeap(MaxHeap,T->Element);
Transform(T->Left);
Transform(T->Right);
}
void ReaOrder(int size) { //后序遍历输出
if (size>=MaxHeap.size) return;
ReaOrder(size*2);
ReaOrder(size*2+1);
cout << MaxHeap.array[size] << " ";
}
int main(int argc, char const *argv[]) {
char c;
for (int i = 0; i < 13; i++) { //6个节点,故2*6+1
cin >> c;
sta.push(c);
}
Tree T = CreateTree();
Transform(T);
ReaOrder(1);
return 0;
}