递归和非递归输出二叉查找树中所有的节点
2010-09-25 09:59
211 查看
首先,我们先来了解一下什么是二叉查找树。
二叉查找树:(1)它是一个二叉树,关于二叉树的概念(每个树节点顶多只有2个子节点,也就是left-child和right-child,并且子节点是有左右之分的)。(2)对于二叉查找树中的每一个节点,它的左节点的value<=根节点的value<=右节点的value
首先我们定义树的数据结构,如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ArithmeticLibrary
{
public class MyNode
{
public int _value; //节点的value
public MyNode parent; //指向root节点
public MyNode left; //指向left-child
public MyNode right; //指向right-child
}
}
创建一个二叉查找树,如下:(很简单的创建,本文的重点是在如何递归输出和非递归输出二叉查找树的所有的节点)
private static MyNode CreateTree()
{
MyNode t = new MyNode();
t._value = 5;
t.parent = null;
t.left = null;
t.right = null;
MyNode node1=null;
node1= new MyNode();
node1._value = 1;
node1.parent = t;
node1.left = null;
node1.right = null;
t.left = node1;
MyNode node2 = null;
node2 = new MyNode();
node2._value = 3;
node2.parent = node1;
node2.left = null;
node2.right = null;
node1.right = node2;
MyNode node3 = null;
node3= new MyNode();
node3._value = 2;
node3.parent = node2;
node3.left = null;
node3.right = null;
node2.left = node3;
MyNode node4 = null;
node4 = new MyNode();
node4._value = 4;
node4.parent = node2;
node4.left = null;
node4.right = null;
node2.right = node4;
MyNode node5 = null;
node5 = new MyNode();
node5._value =10;
node5.parent = t;
node5.left = null;
node5.right = null;
t.right = node5;
MyNode node6 = null;
node6 = new MyNode();
node6._value = 6;
node6.parent = node5;
node6.left = null;
node6.right = null;
node5.left = node6;
MyNode node7 = null;
node7 = new MyNode();
node7._value = 12;
node7.parent = node5;
node7.left = null;
node7.right = null;
node5.right = node7;
return t;
}
如果看这个创建程序看不出图形化的树的结构,你可以按照程序手动的画出树的结构。
递归的输出上面二叉查找树的所有的节点(中序遍历):
关于二叉树的遍历,有先序遍历,中序遍历,后序遍历。关于中序遍历遍历的定义:先遍历树的左节点,然后根节点,最后右节点。
递归的代码如下:
private static void InputNodeValue(MyNode node)
{
if (node.left == null && node.right==null)
{
Console.WriteLine(node._value);
return;
}
if (node.left != null)
{
InputNodeValue(node.left);
}
Console.WriteLine(node._value);
if (node.right!=null)
{
InputNodeValue(node.right);
}
}
可以看出算法的时间复杂度为O(n)
如果采用非递归的方法,此时我们是借用了stack这个辅助的数据结构来做的,代码如下:
private static void Non_InputNodeValue(MyNode root)
{
Stack<MyNode> stack = new Stack<MyNode>();
if (root != null)
{
stack.Push(root);
}
while(stack.Count!=0)
{
MyNode node = stack.Pop();
Console.WriteLine(node._value);
if (node.right != null)
{
stack.Push(node.right);
}
if (node.left != null)
{
stack.Push(node.left);
}
}
}
完整的程序还少了一个main函数,如下:
static void Main(string[] args)
{
MyNode root = CreateTree();
InputNodeValue(root);//递归输出
Console.WriteLine("********************************************************");
Non_InputNodeValue(root); //非递归输出,借用了stack
Console.ReadLine();
}
二叉查找树:(1)它是一个二叉树,关于二叉树的概念(每个树节点顶多只有2个子节点,也就是left-child和right-child,并且子节点是有左右之分的)。(2)对于二叉查找树中的每一个节点,它的左节点的value<=根节点的value<=右节点的value
首先我们定义树的数据结构,如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ArithmeticLibrary
{
public class MyNode
{
public int _value; //节点的value
public MyNode parent; //指向root节点
public MyNode left; //指向left-child
public MyNode right; //指向right-child
}
}
创建一个二叉查找树,如下:(很简单的创建,本文的重点是在如何递归输出和非递归输出二叉查找树的所有的节点)
private static MyNode CreateTree()
{
MyNode t = new MyNode();
t._value = 5;
t.parent = null;
t.left = null;
t.right = null;
MyNode node1=null;
node1= new MyNode();
node1._value = 1;
node1.parent = t;
node1.left = null;
node1.right = null;
t.left = node1;
MyNode node2 = null;
node2 = new MyNode();
node2._value = 3;
node2.parent = node1;
node2.left = null;
node2.right = null;
node1.right = node2;
MyNode node3 = null;
node3= new MyNode();
node3._value = 2;
node3.parent = node2;
node3.left = null;
node3.right = null;
node2.left = node3;
MyNode node4 = null;
node4 = new MyNode();
node4._value = 4;
node4.parent = node2;
node4.left = null;
node4.right = null;
node2.right = node4;
MyNode node5 = null;
node5 = new MyNode();
node5._value =10;
node5.parent = t;
node5.left = null;
node5.right = null;
t.right = node5;
MyNode node6 = null;
node6 = new MyNode();
node6._value = 6;
node6.parent = node5;
node6.left = null;
node6.right = null;
node5.left = node6;
MyNode node7 = null;
node7 = new MyNode();
node7._value = 12;
node7.parent = node5;
node7.left = null;
node7.right = null;
node5.right = node7;
return t;
}
如果看这个创建程序看不出图形化的树的结构,你可以按照程序手动的画出树的结构。
递归的输出上面二叉查找树的所有的节点(中序遍历):
关于二叉树的遍历,有先序遍历,中序遍历,后序遍历。关于中序遍历遍历的定义:先遍历树的左节点,然后根节点,最后右节点。
递归的代码如下:
private static void InputNodeValue(MyNode node)
{
if (node.left == null && node.right==null)
{
Console.WriteLine(node._value);
return;
}
if (node.left != null)
{
InputNodeValue(node.left);
}
Console.WriteLine(node._value);
if (node.right!=null)
{
InputNodeValue(node.right);
}
}
可以看出算法的时间复杂度为O(n)
如果采用非递归的方法,此时我们是借用了stack这个辅助的数据结构来做的,代码如下:
private static void Non_InputNodeValue(MyNode root)
{
Stack<MyNode> stack = new Stack<MyNode>();
if (root != null)
{
stack.Push(root);
}
while(stack.Count!=0)
{
MyNode node = stack.Pop();
Console.WriteLine(node._value);
if (node.right != null)
{
stack.Push(node.right);
}
if (node.left != null)
{
stack.Push(node.left);
}
}
}
完整的程序还少了一个main函数,如下:
static void Main(string[] args)
{
MyNode root = CreateTree();
InputNodeValue(root);//递归输出
Console.WriteLine("********************************************************");
Non_InputNodeValue(root); //非递归输出,借用了stack
Console.ReadLine();
}
相关文章推荐
- [Java]用递归与非递归的形式输出给定目录的所有文件名
- 输出字符串的所有全排列(递归法和非递归,非递归采用组合数学的字典序)
- 算法导论第十二章-二叉搜索树的插入(递归与非递归),中序输出(递归,用栈,既不用栈也不递归)以及节点的删除
- java利用dom4j递归输出所有节点
- 二叉查找树带父节点指针的创建,销毁,查找,删除,插入,找前驱后继,找最小值最大值(递归和非递归的实现)
- 统计输入中所有单词出现的次数(使用二叉查找树实现:递归和非递归)
- unity3d 选择一个物体递归输出所有节点名字
- Sql Server递归查找某一节点下面所有子节点
- 第十周项目3-利用二叉树遍历思想解决问题(2)输出所有叶子节点
- 普通递归算法:输出n个数的所有全排列
- 二叉树(12)----查找两个节点最低祖先节点(或最近公共父节点等),递归和非递归
- php递归无限级分类【先序遍历算】,获取任意节点下所有子孩子
- 写一个递归方法,传入一个Map,返回这个Map对象中一共有多个Map类型的对象 Map中是可以添加Map,被添加的这个Map也可以添加Map,所以需要判断传入的Map对象的所有子节点,如果是Map就
- 递归输出所有出栈次序及卡塔兰数应用
- Java基础知识强化之IO流笔记14:递归之输出指定目录下所有java文件绝对路径的案例
- 递归提取文件夹下所有叶子节点文件至指定文件夹
- 【2013微软校招面试题】输出节点数为n的二叉树的所有形态
- 递归和非递归的方法往二叉排序树中插入新的节点
- 第九周项目3(2)- 输出所有叶子节点
- MSSQL 下递归CTE的应用通过父级获取所有对应的子级节点(一)