/**
* 用二叉树链式存储实现 王道 P149 T10
*
*
* ①算法思想
* ①②③是递归方式
* ④⑤⑥⑦是非递归方式
* ①先序遍历中第k个节点的值(拿递归先序改一下)
* ②中序遍历中第k个结点的值(拿递归中序改一下)
* ③后序遍历中第k个节点的值(拿递归后序改一下)
* ④层次遍历中第k个节点的值(拿层次改一下)
* ⑤先序遍历中第k个节点的值(拿非递归先序改一下)
* ⑥中序遍历中第k个节点的值(拿非递归中序改一下)
* ⑦后序遍历中第k个节点的值(拿非递归后序改一下)
*
*
* ②算法设计
*/
#include <stdio.h>
#include <iostream>
#define MaxSize 100
typedef struct BiTreeNode{
int data;
BiTreeNode *lchild,*rchild;
}BiTreeNode,*BiTree;
//P149 T9
//①先序遍历中第k个节点的值
void GetPreK(BiTree T,int &count,int k,int &k_data){//count是为了在递归中不断地带回,k_data是为了把最终结果带出去
if(T != NULL){
//做逻辑判断
count++;//传了引用的话全局的count都是一个
if(k == count){
k_data = T -> data;
}
GetPreK(T -> lchild,count,k,k_data);
GetPreK(T -> rchild,count,k,k_data);
}
}
//②中序遍历中第k个结点的值
void GetInK(BiTree T,int &count,int k,int &k_data){
if(T != NULL){
GetInK(T -> lchild,count,k,k_data);
//做逻辑判断
count++;
if(k == count){
k_data = T -> data;
}
GetInK(T -> rchild,count,k,k_data);
}
}
//③后序遍历中第k个节点的值
void GetPostK(BiTree T,int &count,int k,int &k_data){
if(T != NULL){
GetPostK(T -> lchild,count,k,k_data);
GetPostK(T -> rchild,count,k,k_data);
//做逻辑判断
count++;
if(k == count){
k_data = T -> data;
}
}
}
//④层次遍历中第k个节点的值
int GetLevelK(BiTree T,int k){
BiTree Queue[MaxSize];//Queue用来存放树的指针
BiTree p = T;
int front = -1, rear = -1;
int count = 0;
Queue[++rear] = p;
while(front != rear){
p = Queue[++front];
//做逻辑判断
count++;
if(count == k){
return p -> data;
}
if(p -> lchild != NULL)
Queue[++rear] = p -> lchild;
if(p -> rchild != NULL)
Queue[++rear] = p -> rchild;
}
return -1;
}
//⑤先序遍历中第k个节点的值
int GetPreK_2(BiTree T,int k){
BiTree stack[MaxSize],p = T;//此处从递归转到非递归需要借助栈
int top = -1;
int count = 0;
while(p || top != -1){//当p为空但top不为空时,说明某个分支遍历结束了,而整体还没有遍历结束,因为栈里还有元素。
if(p != NULL){
// Visit(p);
//做逻辑判断
count++;
if(count == k)
return p -> data;
stack[++top] = p;//压栈,stack储存的是地址
p = p -> lchild;
}else{
p = stack[top--];//此时左子树是遍历结束的,所以栈顶元素直接出栈,找到这个位置然后接着继续访问下一个
p = p -> rchild;
}
}
return -1;
}
//⑥中序遍历中第k个节点的值
int GetInK_2(BiTree T,int k){
BiTree stack[MaxSize],p = T;
int top = -1;
int count = 0;
while(p || top != -1){
if(p){
stack[++top] = p;//压栈
p = p -> lchild;
}else{
p = stack[top--];//此时左子树是遍历结束的,所以栈顶元素直接出栈
// Visit(p);
//做逻辑判断
count++;
if(count == k)
return p -> data;
p = p -> rchild;
}
}
return -1;
}
//⑦后序遍历中第k个节点的值
int GetPostK(BiTree T,int k){
BiTree stack[MaxSize],p = T;
int top = -1,tag[MaxSize] = {0};
int count = 0;
while(p || top != -1){
if(p){
stack[++top] = p;
tag[top] = 1;
p = p -> lchild;
}else{
if(tag[top] == 1){
tag[top] = 2;
p = stack[top];
p = p -> rchild;
}else{//说明是叶子节点了
p = stack[top--];
// Visit(p);
//做逻辑判断
count++;
if(count == k)
return p -> data;
p = NULL;
}
}
}
return -1;
}
07-28
1213
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交