C++非递归算法遍历二叉链表

递归的二叉链表遍历基于类自身函数的自我调用,而二叉链表的非递归操作,基于栈的入栈与弹栈。将中序遍历作为例子:指针访问到结点后,应先记住结点数值入栈,再往左边便利。假如指针为空,弹栈,最后将指针赋值给右子树指针

1. 建立浮标指针,指向根节点

2. 假如指针不是空,入栈数值,将指针更新为左子树指针

3. 当指针为空时,将栈顶元素赋值给新的变量,实现弹栈。

4. 将指针赋值给右子树指针

上述操作是循环,循环条件:指针不是空,或者栈不为空。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉链表是一种常用的二叉树存储结构,它由指向左右子节点的指针和存储数据的变量组成。下面分别介绍二叉树的层次遍历、先序遍历和中序遍历非递归实现。 1. 二叉树层次遍历非递归算法 二叉树的层次遍历可以使用队列来实现。具体步骤如下: - 将根节点入队。 - 循环执行以下操作,直到队列为空: - 弹出队首元素,输出它的值。 - 如果它有左子节点,将左子节点入队。 - 如果它有右子节点,将右子节点入队。 C++代码实现如下: ```c++ void levelOrderTraversal(TreeNode* root) { if (!root) return; queue<TreeNode*> q; q.push(root); while (!q.empty()) { TreeNode* node = q.front(); q.pop(); cout << node->val << " "; if (node->left) q.push(node->left); if (node->right) q.push(node->right); } } ``` 2. 二叉树先序遍历非递归算法 二叉树先序遍历可以借助栈来实现。具体步骤如下: - 将根节点入栈。 - 循环执行以下操作,直到栈为空: - 弹出栈顶元素,输出它的值。 - 如果它有右子节点,将右子节点入栈。 - 如果它有左子节点,将左子节点入栈。 C++代码实现如下: ```c++ void preorderTraversal(TreeNode* root) { if (!root) return; stack<TreeNode*> s; s.push(root); while (!s.empty()) { TreeNode* node = s.top(); s.pop(); cout << node->val << " "; if (node->right) s.push(node->right); if (node->left) s.push(node->left); } } ``` 3. 二叉树中序遍历非递归算法 二叉树中序遍历可以借助栈来实现。具体步骤如下: - 将根节点入栈。 - 循环执行以下操作,直到栈为空: - 将当前节点的所有左子节点依次入栈。 - 弹出栈顶元素,输出它的值。 - 如果它有右子节点,将右子节点入栈。 C++代码实现如下: ```c++ void inorderTraversal(TreeNode* root) { if (!root) return; stack<TreeNode*> s; TreeNode* node = root; while (node || !s.empty()) { while (node) { s.push(node); node = node->left; } node = s.top(); s.pop(); cout << node->val << " "; node = node->right; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值