二叉树中序遍历 递归 非递归

中序遍历的操作如下:
1)中序遍历左子树;
2)访问根节点;
3)中序遍历右子树;



对应的递归算法如下:

void InOrder(Bitree T) {
    if (T != NULL) {
        InOrder(T->lchild);
        visit(T);
        InOrder(T->rchild);
    }
}

对应的非递归算法如下:

void InOrder2(Bitree T) {
    //借助栈实现
    InitStack(S); Bitree p = T;   //初始化栈,p是遍历指针
    while (p || !IsEmpty(S)) {
        if (p) {
            Push(S, p);
            p = p->lchild;     //中序遍历左子树
        }
        else {
            Pop(S, p);
            visit(p);             //访问根节点
            p = p->rchild;   //中序遍历右子树
        }
    }
}

原文地址:https://www.cnblogs.com/brainstorm-yc/p/11762140.html

时间: 2024-10-08 19:52:08

二叉树中序遍历 递归 非递归的相关文章

二叉树先序遍历(非递归)

二叉树的先序遍历(非递归)特别简单 直接上代码,根节点先入栈,然后循环栈不为空,pop出来后让右节点和左节点分别入栈 # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def preorderTraversal(sel

二叉树的中序遍历(非递归)

中序遍历是先遍历左子树,在自身,再遍历右子树, 非递归实现的方法,一直遍历左节点,然后出栈,在遍历右节点 # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def inorderTraversal(self, root

二叉树前后中序遍历的非递归实现

其中前序和中序,简单且容易理解.后序遍历有难度. #include "stdafx.h" #include "stdio.h" #include "stdlib.h" #include "string.h" typedef struct BiNode { char data; struct BiNode *lchild,*rchild; }BiNode,*LinkBiTree; typedef struct stack { L

二叉树前序、中序和后序遍历的非递归实现

1 二叉树的前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 2 二叉树的中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中间访问,所以是中序遍历. 3 二叉树的后序遍历 对于每棵子树,先处理左子树,然后处理右子树,最后处理根.根最后访问,所以是后序遍历. 4 二叉树后序遍历的非递归实现 如果pre为NULL: 左右儿子都是NULL,那么自己出栈: 如果左儿子为NULL,右儿子不为NULL,右儿子进栈: 如果左儿子不为NULL,那

Leetcode: Binary Tree Inorder Traversal(二叉树中序遍历)

题目: Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [1,3,2]. Note: Recursive solution is trivial, could you do it iteratively? 递归解法(C++): /** * Definition for binary tre

二叉树高度,以及栈实现二叉树的先序,中序,后序遍历的非递归操作

求解二叉树的高度 树是递归定义的,所以用递归算法去求一棵二叉树的高度很方便. #include <iostream> #include <cstdio> using namespace std; struct Node { char data; Node *lchild; Node *rchild; }; void High(Node *T, int &h) { if (T == NULL) h = 0; else { int left_h; High(T->lchi

二叉树基本操作续二:前序、中序、后序遍历(非递归 迭代方式)

这里给出二叉树三种遍历方式的迭代实现代码.二叉树的递归实现使用系统栈入栈出栈,而非递归的迭代实现方法就是手动维护一个栈,来模拟递归的入栈出栈过程. 本文没有给出用户栈的代码,如果需要结合上篇的测试代码一起测试,则需要自己实现自己的栈,以及基本的pop.push等栈操作函数. 前序迭代遍历: 1 void iter_preorder(tree_pointer ptr) 2 { 3 //前序遍历:先遍历根节点,然后再分别遍历左右子树 4 int top = -1; 5 tree_pointer st

二叉树非递归先中后序遍历 及 非递归交换二叉树两个孩子的位置

看到一个非递归交换一个二叉树的左右孩子的位置,于是想实现之,才发现非递归的先中后序遍历都忘记了……于是杂七杂八的写了一些,抄抄资料就实现了,然后实现非递归交换两个孩子的位置还是相当容易的.先直接上代码吧,其实这东西还是得自己写写过一遍的,印象才会更加深刻: #include <iostream> #include <fstream> #include <string> #include <stack> using std::cout; using std::

二叉树前序、后序和后序遍历(非递归实现)

二叉树前序.后序和后序遍历(非递归实现) (1)前序     我们知道,前序遍历的顺序是根左右,当根节点不为空时,该节点才可以被打印.目前书上常见对树的遍历都是采用递归的方法实现的,我们知道递归必然会产生中断,也就是有现场信息的保存,如果要实现非递归,那么我们必须自己要有一个栈,用来保存现场信息. 我先给出实现的伪代码,稍后我将解释为什么需要这么做,为何要用到这些条件. 伪代码如下: 1 void PreOrderTraverse(BinaryTree root) 2 { 3    Binary

先序遍历的非递归遍历算法

先序遍历的非递归遍历算法: 1 void InOrderTraversal(BinTree BT) 2 { 3 BinTree T=BT; 4 stack S=CreatStack(MaxSize)://创建并初始化堆栈S 5 while(T || !IsEmpty(S)){ 6 While(T){//一直向左并将沿途节点压入堆栈 7 printf("%5d",T->Data);//(访问)打印节点 8 Push(S,T); 9 T=T->left; 10 } 11 if(