【算法与数据结构】二叉树的 中序 遍历

前一篇写了二叉树的先序遍历,本篇记录一下二叉树的中序遍历,主要是非递归形式的中序遍历。

由于距离上篇有好几天了,所以这里把二叉树的创建和存储结构也重复的写了一遍。

二叉树如下

二叉树的存储方式依然是二叉链表方式,其结构如下

typedef struct _tagBinTree
{
unsigned char value;
struct _tagBinTree* left;
struct _tagBinTree* right;
}BinTree, *PBinTree;

先序递归形式的创建二叉树代码如下:


void InitBinTree(PBinTree& pRoot)
{
cout<<"请输入节点的值, #表示NULL:";
unsigned char ch = 0;
cin >> ch;
if (‘#‘ == ch)
{
pRoot = NULL;
}
else
{
pRoot = new BinTree();
if (NULL == pRoot)
{
exit(-1);
}
pRoot->value = ch;

InitBinTree(pRoot->left);
InitBinTree(pRoot->right);
}
}

执行情况




访问二叉树,这里只是打印了一下节点的值

void Visit(PBinTree pNode)
{
cout << "节点的值为 "<<pNode->value<<endl;
}


非递归方式中序遍历二叉树原理


/************************************************************************/
/* 非递归中序遍历二叉树
存储方式为二叉链表,原理如下:
中序遍历的次序为左子树,根节点,右子树

首先将根节点入栈
while(栈不空)
{
取栈顶元素a
if(a不为NULL)
{
将栈顶元素的左子树入栈
}
else
{
栈顶元素a(为NULL)出栈
if(此时栈不为空)
{
将栈顶元素b出栈,访问此节点,将b的右子树入栈
}
}
}

/************************************************************************/


非递归中序遍历代码


void MidOrderTraverse(PBinTree& pRoot)
{
stack<PBinTree> stBinTree;

//根节点入栈
stBinTree.push(pRoot);

while(! stBinTree.empty())
{
//取栈顶元素
PBinTree pNode = stBinTree.top();
//栈顶元素不为NULL
if (pNode != NULL)
{
stBinTree.push(pNode->left);
}
else
{
//栈顶元素为NULL,将其出栈
stBinTree.pop();

//如果此时栈不为空
if (! stBinTree.empty())
{
//将栈顶元素出栈,访问此节点,并将其右子树入栈
pNode = stBinTree.top();
stBinTree.pop();
Visit(pNode);
stBinTree.push(pNode->right);
}
}
}
}


main函数


int _tmain(int argc, _TCHAR* argv[])
{
cout << "\r\n-----------开始 递归先序构造二叉树 -----------\r\n";
PBinTree pRoot = NULL;
InitBinTree(pRoot);
cout << "\r\n-----------结束 递归先序构造二叉树 -----------\r\n";

cout << "\r\n\r\n----------开始 非递归中序遍历二叉树------------\r\n";
MidOrderTraverse(pRoot);
cout << "-----------结束 非递归中序遍历二叉树------------\r\n\r\n";

return 0;
}

执行情况

【算法与数据结构】二叉树的 中序 遍历

时间: 2024-10-21 02:59:15

【算法与数据结构】二叉树的 中序 遍历的相关文章

数据结构与算法(c++)——查找二叉树与中序遍历

查找树ADT--查找二叉树 定义:对于树中的每个节点X,它的左子树中的所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项. 现在给出字段和方法定义(BinarySearchTree.h) #include <queue> class BinarySearchTree { private: struct Node { int value; Node* left; Node* right; }; Node* root; void insert(Node*, int); void trav

Java数据结构系列之——树(4):二叉树的中序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树的中序遍历:递归与非递归实现 * * @author wl * */ public class BiTreeInOrder { // 中序遍历的递归实现 public static void biTreeInOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreeInOrderByRecursi

数据结构之二叉树 树结构练习——排序二叉树的中序遍历 (排序建树+中序遍历)

树结构练习——排序二叉树的中序遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的话)的关键值大于该节点的关键值.现给定一组数据,请你对这组数据按给定顺序建立一棵排序二叉树,并输出其中序 遍历的结果. 输入 输入包含多组数据,每组数据格式如下.

[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? confused what "{1,#,2,3}" means? > read

树结构练习——排序二叉树的中序遍历

树结构练习--排序二叉树的中序遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是--(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的话)的关键值大于该节点的关键值.现给定一组数据,请你对这组数据按给定顺序建立一棵排序二叉树,并输出其中序遍历的结果. 输入 输入包含多组数据,每组数据格式如下.

lintcode 容易题:Binary Tree Inorder Traversal 二叉树的中序遍历

题目: 二叉树的中序遍历 给出一棵二叉树,返回其中序遍历 样例 给出二叉树 {1,#,2,3}, 1 2 / 3 返回 [1,3,2]. 挑战 你能使用非递归算法来实现么? 解题: 程序直接来源 Java程序: /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val

树结构练习——排序二叉树的中序遍历(二叉搜索树)

树结构练习——排序二叉树的中序遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的话)的关键值大于该节点的关键值.现给定一组数据,请你对这组数据按给定顺序建立一棵排序二叉树,并输出其中序 遍历的结果. 输入 输入包含多组数据,每组数据格式如下.

已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历

[题解整理]二分题 题目类型: 二分查找: 二分答案. 大致解题思路: 查找注意有序和返回值: 浮点数注意精度: 整数注意返回值,建议另外维护一个变量,用于储存可行解. 题目 分类 传送门 WA点 poj 2785 二分查找 题解 lightoj 1088 二分查找 题解 lightoj 1307 二分查找 题解 longlong poj 2456 整数二分答案 题解 poj 3104 整数二分答案 题解 poj 3258 整数二分答案 题解 poj 3273 整数二分答案 题解 lightoj

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? 说明:1)下面有两种实现:递归(Recursive )与非递归(迭代iterative