二叉树是数据结构里的好东西!!!
树与队列可以达到逐层处理的效果!
此处是非递归的形式来创建二叉树,因此借助了循环队列来辅助。
这样的创建就是一层一层的创建区别于递归创建。
结构体:
队列储存的是nodePtr的指针
typedef struct node {
char data;
struct node* left;
struct node* right;
}Node,*NodePtr;
typedef struct {
int front;
int rear;
NodePtr* nodesPtr;//二级指针
}Que,*QuePtr;
创建节点:pass
NodePtr constructNode(char data) {
NodePtr new_Node = (NodePtr)malloc(sizeof(Node));
new_Node->data = data;
new_Node->left = NULL;
new_Node->right = NULL;
return new_Node;
}
主体函数:初始化队列后,先放入根节点,然后进入while判断,为双向结点创建左右孩子;再分别将左右孩子放入队列,因为有可能左右孩子还可以是别人的双亲。这就是借助队列创建是逐层创建的原因。
NodePtr TobeTree(char* s) {
int i;
char tempC;
i = 0;
tempC = s[i];
QuePtr CQ = Init();
NodePtr root = constructNode(tempC);
enque(CQ, root);
while (!isEmpty(CQ)) {
NodePtr parent = deque(CQ);
i++;
tempC = s[i];
if (tempC != '#') {
NodePtr chirld_l = constructNode(tempC);
printf("%d ", chirld_l->data);
enque(CQ, chirld_l);
parent->left = chirld_l;
}
i++;
tempC = s[i];
if (tempC != '#') {
NodePtr chirld_r = constructNode(tempC);
enque(CQ, chirld_r);
parent->right = chirld_r;
}
}
return root;
}
递归遍历:(前序,中序,后序)递归罢了,前,中,后的遍历方式只是位置不一样!
void preOder(NodePtr root) {
if (root == NULL) return;
printf("%c ", root->data);
preOder(root->left);
preOder(root->right);
}
层序遍历:继续借助队列,思路也比较简单,把根节点放入,在出队的时候将它的左右孩子放入,也能达到逐层遍历的效果。
void level(QuePtr CQ, NodePtr root) {
enque(CQ, root);
while (!isEmpty(CQ)) {
NodePtr out = deque(CQ);
printf("%d ", out->data);
if (out->left != NULL) {
enque(CQ, out->left);
}
if (out->right != NULL) {
enque(CQ, out->right);
}
}
}