先序遍历非递归算法java_二叉树先序遍历的非递归算法具体实现

在前面一文,说过二叉树的递归遍历算法(二叉树先根(先序)遍历的改进),此文主要讲二叉树的非递归算法,采用栈结构

总结先根遍历得到的非递归算法思想如下:

1)入栈,主要是先头结点入栈,然后visit此结点

2)while,循环遍历当前结点,直至左孩子没有结点

3)if结点的右孩子为真,转入1)继续遍历,否则退出当前结点转入父母结点遍历转入1)

先看符合此思想的算法:

int PreOrderTraverseNonRecursiveEx(const BiTree &T, int (*VisitNode)(TElemType data))

{

if (T == NULL)

{

return -1;

}

BiTNode *pBiNode = T;

SqStack S;

InitStack(&S);

Push(&S, (SElemType)T);

while (!IsStackEmpty(S))

{

while (pBiNode)

{

VisitNode(pBiNode->data);

if (pBiNode != T)

{

Push(&S, (SElemType)pBiNode);

}

pBiNode = pBiNode->lchild;

}

if(pBiNode == NULL)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
先序遍历非递归算法可以通过使用栈来实现具体步骤如下: 1. 创建一个栈,并将根节点入栈。 2. 当栈不为空时,执行以下操作: 1. 弹出栈顶节点并输出该节点的值。 2. 如果该节点的右子树非空,则将右子树入栈。 3. 如果该节点的左子树非空,则将左子树入栈。 3. 当栈为空时,遍历结束。 以下是C语言实现代码: ```c #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 // 定义二叉树结构体 typedef struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 定义栈结构体 typedef struct Stack { TreeNode* data[MAXSIZE]; int top; } Stack; // 初始化栈 void initStack(Stack* s) { s->top = -1; } // 判断栈是否为空 int isEmpty(Stack* s) { return s->top == -1; } // 判断栈是否已满 int isFull(Stack* s) { return s->top == MAXSIZE - 1; } // 入栈 void push(Stack* s, TreeNode* node) { if (isFull(s)) { printf("Stack is full!\n"); return; } s->data[++(s->top)] = node; } // 出栈 TreeNode* pop(Stack* s) { if (isEmpty(s)) { printf("Stack is empty!\n"); return NULL; } return s->data[(s->top)--]; } // 先序遍历二叉树非递归算法) void preOrder(TreeNode* root) { if (root == NULL) { return; } Stack s; initStack(&s); push(&s, root); while (!isEmpty(&s)) { TreeNode* cur = pop(&s); printf("%d ", cur->data); if (cur->right) { push(&s, cur->right); } if (cur->left) { push(&s, cur->left); } } } // 创建新节点 TreeNode* createNode(int data) { TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); node->data = data; node->left = NULL; node->right = NULL; return node; } // 构建二叉树 TreeNode* buildTree() { TreeNode* root = createNode(1); root->left = createNode(2); root->right = createNode(3); root->left->left = createNode(4); root->left->right = createNode(5); root->right->left = createNode(6); root->right->right = createNode(7); return root; } int main() { TreeNode* root = buildTree(); preOrder(root); // 输出:1 2 4 5 3 6 7 return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值