#include <stdio.h>
#include <stdlib.h>
typedef struct treeNode* Node;
typedef struct treeNode Elem;
struct treeNode{
Node lChild,rChild;
int data;
};
typedef Node BTree;
typedef struct stack* StackElem;
struct stack{
Node data;
StackElem next;
};
typedef StackElem Stack;
void push(Stack* stack , Node node){
StackElem elem = (StackElem)malloc(sizeof(StackElem));
elem->data = node;
elem->next = *stack;
*stack = elem;
}
void getTop(Stack *stack,Node *node){
*node = NULL;
if(*stack == NULL){return;}
StackElem elem = *stack;
*node = elem->data;
}
void pop(Stack* stack , Node* node){
*node = NULL;
if(*stack == NULL){return;}
StackElem elem = *stack;
*stack = elem->next;
*node = elem->data;
}
void visitNode(Node node){
if(node == NULL){
printf("node is null , data not exists");
}
printf("%d \t\t",node->data);
}
void createNode(Node* node,int data){
*node = (Node)malloc(sizeof(Elem));
(*node)->data= data;
(*node)->lChild = NULL;
(*node)->rChild = NULL;
}
void preOrderBTree(Stack* stack){
while((*stack)!=NULL){
Node node = NULL;
pop(stack,&node);
while(node != NULL){
visitNode(node); //访问根节点
push(stack,node->rChild); //防止丢失右子树,将右子树入栈
node = node->lChild; //继续访问左子树
}
}
}
void inOrderBTree(Stack* stack){
Node node = NULL;
pop(stack,&node);
while(*stack != NULL || node != NULL){
while(node != NULL){
push(stack,node);
node = node ->lChild;
}
pop(stack,&node);
if(node != NULL){
printf("%d \t\t",node->data);
node = node->rChild;
}
}
/**
1.先左子树到底。逐步压栈
2.出栈获取节点数据。
3.如果节点有右子树,重复1. 2. 步
*/
}
void postOrderBTree(Stack* stack){
/**
Node node = NULL;
Node temp = NULL;
pop(stack,&node);
while(*stack != NULL || node != NULL){
getTop(stack,&temp);
if(temp != node){
while(node != NULL){
push(stack,node);
node = node ->lChild;
}
}else{
pop(stack,&node);
if(node != NULL){
printf("%d \t\t",node->data);
}
}
getTop(stack,&node);
if(node->rChild != NULL ){
node= node ->rChild;
}else{
pop(stack,&node);
if(node != NULL){
printf("%d \t\t",node->data);
//node = node->rChild;
getTop(stack,&node);
//node = node ->rChild;
}
}
}
*/
}
void main(){
//构建二叉树
BTree tree = NULL;
Node node1 = NULL;
Node node2 = NULL;
Node node3 = NULL;
Node node4 = NULL;
Node node5 = NULL;
Node node6 = NULL;
Node node7 = NULL;
Node node8 = NULL;
Node node9 = NULL;
Node node10 = NULL;
//初始化节点
createNode(&node1,2);
createNode(&node2,1);
createNode(&node3,3);
createNode(&node4,5);
createNode(&node5,8);
createNode(&node6,10);
createNode(&node7,2);
createNode(&node8,100);
createNode(&node9,20);
createNode(&node10,25);
//按照预定结构组装成书
node6->lChild = node9;
node6->rChild = node10;
node4->lChild = node7;
node5->rChild = node8;
node2->lChild = node4;
node2->rChild = node5;
node3->rChild = node6;
node1->lChild = node2;
node1->rChild = node3;
tree = node1;
Stack stack = NULL;
// initial(&stack);
push(&stack,tree); // 统一处理,将根节点保存到栈中
//先序遍历
preOrderBTree(&stack);
printf("\n===============================================================\n");
//后序遍历
stack = NULL;
push(&stack,tree);
postOrderBTree(&stack);
printf("\n===============================================================\n");
//中序遍历
inOrderBTree(&stack);
//层级遍历
}
分享到:
相关推荐
非递归实现则通常借助栈来模拟递归过程。 2. 中序遍历(Inorder Traversal): 中序遍历的顺序是左子树 -> 根节点 -> 右子树。在二叉搜索树中,中序遍历可以得到有序序列。C语言的实现同样可以采用递归或非递归方法...
同样地,我们可以借助栈来实现非递归版本。从根节点开始,一直向左移动并将经过的节点压入栈中,直到遇到左子树的末端。此时,从栈中弹出最顶部的节点进行访问,然后转向其右子树,重复这一过程直至所有节点都被访问...
(3)中序遍历二叉树:非递归算法(最好也能实现先序,后序非递归算法)。 (4)求二叉树的高度 。 (5)求二叉树的叶子个数。 (6)对于树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间。 (8...
非递归算法则通常借助于栈来实现,首先将根节点压入栈中,然后反复执行以下操作:若栈非空,则弹出栈顶元素,访问该元素,如果它有左子树且未被访问过,则将其左子树压入栈中;否则,如果它有右子树,就转去访问右子...
1. 掌握二叉树的结构特征,以及各种存储结构的特点及适用范围。 2. 掌握用指针类型描述、访问和...7. 借助队列实现二叉树的层次遍历。 8. 在主函数中设计一个简单的菜单,调试上述算法,要求1-3必做,4-7为选做。
6. **中序线索二叉树**:在二叉链表中插入线索,使得中序遍历可以连续进行,无需借助栈。线索化过程涉及修改节点的指针,使其既能表示子节点关系,又能指示中序遍历的方向。 7. **层次遍历**:也称宽度优先遍历,...
输入字符序列,建立二叉链表;...3.中序遍历二叉树(非递归算法)!求二叉树的高度!求二叉树的叶子个数!;对于树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间!借助队列实现二叉树的层次遍历!
非递归实现时,同样可以借助栈来完成。 **后序遍历**: 后序遍历,也叫左-右-根遍历,先遍历左子树和右子树,最后访问根节点。这种遍历方式在计算节点的和、释放内存等操作时非常有用,因为可以确保子节点的操作在...
非递归方法则需要借助栈来保存节点,先将所有非叶子节点压栈,直到遍历到叶子节点并进行计数。 **5. 结论** 递归和非递归遍历二叉树各有优缺点。递归方法简洁直观,但可能导致栈溢出;非递归方法避免了栈溢出问题...
二叉树的先序遍历采用非递归方法,借助一个存储结点指针的栈。遍历开始时,根结点入栈,然后不断检查栈顶元素,若其有左孩子或右孩子,则相应地进行访问和入栈操作,直到栈为空,遍历结束。 实验中涉及的主要函数有...
1、(必做题)假设二叉树中数据元素类型是字符型,请采用二叉链表实现二叉树的以下基本操作: (1)根据二叉树的先序序列和中序序列构造二叉树; (2)根据先序遍历二叉树; (3)根据中序遍历二叉树; (4)根据...
线索二叉树是一种特殊形式的二叉树,它在二叉链表的基础上增加了线索,用于在不使用额外栈或递归的情况下实现前序、中序和后序遍历。这种数据结构在处理大规模数据时非常有用,因为它可以提高查找效率。下面我们将...
- 线索二叉树是在二叉链表的基础上添加线索,使得在非递归遍历时可以沿任意方向前进。`算法6-10 线索二叉树结点类定义.txt`可能包含了如何定义线索二叉树节点的代码,包括指向前驱和后继的线索。 - `算法6-11 基于...
这样,通过线索二叉树,我们可以在不改变原有二叉树结构的前提下,快速定位到节点的前驱和后继,从而实现非递归的遍历算法。 1. **线索二叉树的构建**: - 在构造线索二叉树时,首先需要确定遍历的顺序,如中序...
非递归实现同样可以借助栈,但入栈和出栈的顺序不同。 - **后序遍历**:访问顺序为左子树 -> 右子树 -> 根节点。递归实现中,先递归遍历左右子树,最后访问根节点。非递归实现较复杂,可能需要两个栈来辅助。 - **...
3. 实现二叉树的非递归遍历:这通常需要借助于辅助的数据结构,如栈。对于先序遍历,可以采用迭代的方式,利用栈来模拟递归调用的过程;对于中序遍历,可以采用栈结合迭代,或者使用 Morris遍历;对于后序遍历,通常...
4. **线索二叉树**:线索二叉树是在二叉链表的基础上增加线索,以便在非递归方式下进行中序或其他遍历。T所指节点没有左子树的充要条件是其左线索为空。 5. **二叉树遍历**:在非空树上,根节点没有直接前驱。...
非递归实现同样需要借助栈。 递归是实现这些遍历的常用方法,它直观且简洁,但可能导致函数调用栈过深。非递归方法,如使用栈或队列,虽然实现起来相对复杂,但能避免深度递归的问题,适合处理大规模数据。 计算...
- 掌握如何通过递归或非递归方式实现对二叉树的操作。 #### 实验要求 1. **认真阅读和掌握本实验的程序**:理解代码逻辑,熟悉各个函数的功能和实现细节。 2. **上机运行本程序**:通过实际操作加深对二叉树操作的...