zoukankan      html  css  js  c++  java
  • 二叉树

    二叉树的定义是递归的,一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根结点加上两颗分别称为左子树和右子树、互不相交的二叉树组成。

    该数据结构的难点有两个:

    1、理解在递归算法中根结点指针保持不变,所以可以把该指针作为参数传入。变的事root->lNode及其下一个递归定义结点的指针值。

    2、递归算法的执行流程。

    二叉树的设计和实现:
    1、二叉树采用链式存储,结点包含三个域,左结点链接域,右结点链接域,数据域。
    2、分别用结构体和类来表示二叉树的结点和抽象数据类型。
    3、重要的方法有:
    1)二叉树的建立。
    2)二叉树的输出。
    3)前序、中序和后序遍历输出。
    4、二叉树的定义是递归的,所以递归算法在儿叉树的程序中很有用。

    二叉树的结点包含一个数据域和两个链接域,代码如下:

    struct BTNode
    {
    	int data;	//数据域
    	BTNode *lNode,*rNode;	//左右子女链接域
    	BTNode()
    	{
    		lNode=NULL;
    		rNode=NULL;
    	}
    	BTNode(int x,BTNode *l=NULL,BTNode *r=NULL)
    	{
    		data=x;
    		lNode=l;
    		rNode=r;
    	}
    
    };
    

    二叉树的抽象数据类型由类来表示,代码如下:

    class BinaryTree{
    protected:
    	BTNode * r;	//定义根结点指针,Caution,注意这个指针的变化
    	int endValue;
    
    public:
    	BinaryTree(){
    		r=NULL;	//初始化根结点
    		endValue=0;
    	}	//构造函数
    	~BinaryTree(){}	//析构函数
    
    	//二叉树的建立
    	void InitBT(BTNode *&subTree);	//建立二叉树
    	
    	//二叉树的前序、中序和后序遍历输出
    	void POrderBT(BTNode *subTree);	//前序遍历输出
    	void MOrderBT(BTNode *subTree);	//中序遍历输出
    	void LOrderBT(BTNode *subTree);	//后序遍历输出
    
    	//辅助函数
    	BTNode *getRTree()const{return r;}		//获取根指针
    };
    

    二叉树的难点在于建立二叉树和对递归算法的理解,二叉树的建立,遍历算法如下:

    void BinaryTree::InitBT(BTNode *&subTree)		//subTree保持不变,subTree->lNode这个指针在变化
    {
    	
    	int data;		//值域
    	if(!cin.eof())	//结束标记Ctrl+Z,记住
    	{
    		cin>>data;
    		if(data!=endValue)//如果数值不为结束标记
    		{
    			subTree=new BTNode(data);
    			if(subTree==NULL)cout<<"内存分配错误";
    			InitBT(subTree->lNode);	//递归建立左子树,深刻理解递归的含义
    			InitBT(subTree->rNode);	//递归建立右子树
    			
    		}
    		else
    		{
    			subTree=NULL;	//如果data==endValue,则结束创建
    		}
    
    	}
    }
    

    三种递归算法:

    void BinaryTree::POrderBT(BTNode *subTree)
    {
    	if(subTree!=NULL)
    	{
    		cout<<subTree->data<<endl;
    		POrderBT(subTree->lNode);
    		POrderBT(subTree->rNode);
    
    	}
    
    }
    
    void BinaryTree::MOrderBT(BTNode *subTree)
    {
    	if(subTree!=NULL)
    	{
    		
    		MOrderBT(subTree->lNode);
    		cout<<subTree->data<<endl;
    		MOrderBT(subTree->rNode);
    
    	}
    
    }
    void BinaryTree::LOrderBT(BTNode *subTree)
    {
    	if(subTree!=NULL)
    	{
    		LOrderBT(subTree->lNode);
    		LOrderBT(subTree->rNode);
    		cout<<subTree->data<<endl;
    	}
    
    }
    

    测试数据为:

    1 2 0 0 3 0 0

    前序遍历结果为:

    1 2 3

    中序遍历结果为:

    2 1 3

    后序遍历结果为:

    2 3 1

    总结:

    1、当一个问题比较复杂时,先在纸上画图,在纸上执行几步,可以很快找到思路。

    2、断点调试技术很重要。

  • 相关阅读:
    利用Selenium自动化web测试
    【译】.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱
    SlickGrid example 8:折线图
    SlickGrid example 7:鼠标事件
    SlickGrid example 6:Ajax加载
    SlickGrid example 5:带子项的展开收缩
    SlickGrid example 4: 过滤
    CentOS下配置iptables防火墙 linux NAT(iptables)配置
    ntp server
    parted
  • 原文地址:https://www.cnblogs.com/fistao/p/3000706.html
Copyright © 2011-2022 走看看