编程算法 - 中序遍历 递归/迭代 代码(C)

中序遍历 递归/迭代 代码(C)

本文地址: http://blog.csdn.net/caroline_wendy

中序遍历(InOrder)作为二叉搜索树的排序方式, 有着重要的作用.

递归和迭代的方法都需要掌握, 迭代主要使用了栈(stack)进行输入输出.

代码:

/*
 * main.cpp
 *
 *  Created on: 2014.9.18
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>
#include <list>
#include <queue>
#include <stack>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

struct BinaryTreeNode {
	BinaryTreeNode(int _value) {
		value = _value;
		left = NULL;
		right = NULL;
	}

	int value;
	BinaryTreeNode* left;
	BinaryTreeNode* right;
};

void printTree (BinaryTreeNode* tree)
{
	BinaryTreeNode* node = tree;
	std::queue<BinaryTreeNode*> temp1;
	std::queue<BinaryTreeNode*> temp2;

	temp1.push(node);

	while (!temp1.empty())
	{
		node = temp1.front();
		if (node->left != NULL) {
			temp2.push(node->left);
		}

		if (node->right != NULL) {
			temp2.push(node->right);
		}

		temp1.pop();

		std::cout << node->value  << " ";

		if (temp1.empty())
		{
			std::cout << std::endl;
			temp1 = temp2;
			std::queue<BinaryTreeNode*> empty;
			std::swap(temp2, empty);
		}
	}
}

BinaryTreeNode* buildTree (void)
{
	BinaryTreeNode* root = new BinaryTreeNode(1);
	BinaryTreeNode* node2 = new BinaryTreeNode(2);
	BinaryTreeNode* node3 = new BinaryTreeNode(3);
	BinaryTreeNode* node4 = new BinaryTreeNode(4);
	BinaryTreeNode* node5 = new BinaryTreeNode(5);
	BinaryTreeNode* node6 = new BinaryTreeNode(6);
	BinaryTreeNode* node7 = new BinaryTreeNode(7);
	BinaryTreeNode* node8 = new BinaryTreeNode(8);
	BinaryTreeNode* node9 = new BinaryTreeNode(9);
	BinaryTreeNode* node10 = new BinaryTreeNode(10);

	root->left = node2;
	root->right = node3;

	node2->left = node4;
	node2->right = node5;

	node4->left = node6;
	node4->right = node7;

	node5->left = node8;
	node5->right = node9;

	node9->left = node10;

	return root;
}

void InOrder(BinaryTreeNode *root)
{
	if(root == NULL)
		return;

	stack<BinaryTreeNode*> s;
	s.push(root);
	BinaryTreeNode* node = root->left;

	while (node != NULL || !s.empty())
	{
		while (node != NULL)
		{
			s.push(node);
			node = node->left;
		}
		node = s.top();
		s.pop();

		printf("%d ", node->value);
		node = node->right;
	}
}

void InOrderR(BinaryTreeNode* root) {
	if (root == NULL) return;
	InOrder(root->left);
	printf("%d ", root->value);
	InOrder(root->right);
}

int main (void)
{
	BinaryTreeNode* root = buildTree();
	printTree(root);
	InOrder(root);
	cout << endl;
	InOrderR(root);
	cout << endl;
	return 0;
}

输出:

1
2 3
4 5
6 7 8 9
10
6 4 7 2 8 5 10 9 1 3
6 4 7 2 8 5 10 9 1 3

时间: 2024-10-08 16:37:19

编程算法 - 中序遍历 递归/迭代 代码(C)的相关文章

中序遍历 递归与非递归

1 /** 2 * Definition for binary tree 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 public class Solution { 11 12 public List<Integer> inorderTraversal(TreeNode root) {

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

中序遍历的操作如下: 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 ||

算法学习 - 树的三种遍历(递归实现)先序遍历,中序遍历,后序遍历

树的遍历 这三种遍历方法其实都很简单的,举例来说: a / b c 这个是例子下面讲下这三个是如何遍历的. struct TreeNode; typedef TreeNode* Node; typedef int EleType; struct TreeNode{ Node lchild; Node rchild; EleType data; }; 先序遍历 先序遍历,就是从上到下,从左到右,遇到一个就遍历,上面这个例子遍历的序列就是:a b c 递归代码如下: void PreOrderTre

很简洁的前序遍历和中序遍历二叉树代码(递归实现)

void preOrder(BinTree *root) //递归前序遍历 { if(root!=NULL) { cout<<root->data<<" "; preOrder1(root->lchild); preOrder1(root->rchild); } } void inOrder1(BinTree *root) //递归中序遍历 { if(root!=NULL) { inOrder1(root->lchild); cout&l

【LeetCode-面试算法经典-Java实现】【094-Binary Tree Inorder Traversal(二叉树中序遍历)】

[094-Binary Tree Inorder Traversal(二叉树中序遍历)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a binary tree, return the inorder traversal of its nodes' values. 题目大意 对一棵二叉树进行中序遍历. 解题思路 解法一:递归实现,解法二:迭代实现. 代码实现 二叉树结点类 public class TreeNode { int val; TreeNod

已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法

二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或者后序遍历的最后一个结点,查找对应在中序遍历中的位置,就可以确定左子树包含的元素和右子树包含的元素,最后通过递归来实现就可以了. 二叉树的表示形式为 //二叉树的结构表示为 class TreeNode { int val; TreeNode left; TreeNode right; TreeNo

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

前一篇写了二叉树的先序遍历,本篇记录一下二叉树的中序遍历,主要是非递归形式的中序遍历. 由于距离上篇有好几天了,所以这里把二叉树的创建和存储结构也重复的写了一遍. 二叉树如下 二叉树的存储方式依然是二叉链表方式,其结构如下 typedef struct _tagBinTree { unsigned char value; struct _tagBinTree* left; struct _tagBinTree* right; }BinTree, *PBinTree; 先序递归形式的创建二叉树代码

算法题——二叉树结点的中序遍历的后继结点

题目:给出二叉树的一个结点,返回它中序遍历顺序的下一个结点. 思路: 如果有指向父亲的结点,则: 如果当前结点有右儿子,或者当前结点是根结点,则后继结点为右子树的最左叶节点: 否则,如果当前结点是父结点的左儿子,则后继结点就是父结点:(其实是第三种情况的一个特例,即自己是第0代祖先,返回第一代祖先) 否则,向上遍历,直到n-1代祖先是n代祖先的左儿子,则后继结点为n代祖先:或者遍历到根节点后未找到符合的n代结点,则该结点为中序遍历的最后结点,没有后继. 时间复杂度为树的高度O(lgN). 代码:

中序遍历-----二叉查找树的遍历(迭代版,不使用栈或者队列)

二叉查找树(Binary Search Tree)的遍历的方法有很多,通常使用的是递归的遍历,其便于理解,但是使用递归的话会造成程序运行的空间浪费,效率并不高.为此可以使用一个栈来模拟递归的过程,实现迭代版的二叉查找树的遍历.但是会使用到额外的存储空间,虽说在运行效率上比递归版的有所提高,但是额外的存储空间还是一定的浪费.但是如何减少额外的存储空间呢?我们知道二叉查找树是可以转换为一个双向环形链表(二叉查找树与双向环形链表的转化),而链表的遍历是不需要额外的空间的,因此我们可以考虑通过充分利用树