• 实用数据结构之二叉排序树小结


    实用数据结构之二叉排序树小结:

    定义:

    满足以下条件的二叉树:
     对于树上任意一个结点,其上的数值必大于等于其左子树上任意结点的数值
     必小于等于其右子树上任意结点的数值

    故二叉排序树的插入:

    1.若当前树为空,则x为其根结点
    2.若当前结点大于x,则x插入其左子树, 若当前结点小于x,则x插入其右子树
    若当前结点等于x,则根据具体情况选择插入左子树或者右子树或者直接忽略


    例如: 输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历
    输入:
    5
    1 6 5 9 8
    输出:
    1 6 5 9 8
    1 5 6 8 9
    5 8 9 6 1

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    struct Node//二叉树结点结构体
    {
    	Node *lchild;//左儿子指针
    	Node *rchild;//右儿子指针
    	int c;//结点字符信息
    }Tree[110];//静态内存分配数组
    
    int loc;//静态数组中已经分配的结点个数
    
    Node *create()//申请一个结点空间,返回指向其的指针
    {
    	Tree[loc].lchild = Tree[loc].rchild = NULL;//初始化左右儿子为空
    	return &Tree[loc++];//返回指针,loc自增
    }
    
    void preOrder(Node *T)//先序遍历
    {
    	cout<<T->c<<" ";
    	if (T->lchild!=NULL)
    		preOrder(T->lchild);
    	if (T->rchild!=NULL)
    		preOrder(T->rchild);
    }
    void inOrder(Node *T)//中序遍历
    {
    	if (T->lchild!=NULL)
    		inOrder(T->lchild);
    	cout<<T->c<<" ";
    	if (T->rchild!=NULL)
    		inOrder(T->rchild);	
    }
    
    void postOrder(Node *T)//后序遍历
    {
    	if (T->lchild!=NULL)
    	postOrder(T->lchild);
    	if (T->rchild!=NULL)
    	postOrder(T->rchild);
       cout<<T->c<<" ";
    }
    
    Node* insert(Node* root,int value)
    {
    	if (root==NULL)//若当前树为空
    	{
    		root = create();
    		root->c = value;
    		return root;
    	}
    	else
    		if (root->c <value)
    		{
    			root->rchild = insert(root->rchild,value);
    		}
    		else if(root->c > value)
    	{
    		root->lchild = insert(root->lchild,value);
    	}
    
    return root;
    }
    
    int main()
    {
    	int n;
    	while(cin>>n)
    	{
    		loc = 0;
           Node *root = NULL;
    	   for (int i=0;i<n;i++)
    	   {
    		   int value;
    		   cin>>value;
    		   root = insert(root,value);
    	   }
    
    		preOrder(root);
    		cout<<endl;
    		inOrder(root);
    		cout<<endl;
    		postOrder(root);
    		cout<<endl;
    	}
    	
       // system("pause");
    	return 0;
    }


     

     

  • 相关阅读:
    (Android)如何将一个高复用性项目供其他项目使用(jar导出,导入,Is Library)(转)
    Android:SlidingMenu 使用详解 .
    单项链表和双向链表的区别
    LinkedList 与 ArrayList的区别
    完全二叉树与满二叉树
    C/C++之回调函数
    C++静态库与动态库
    C++项目中的extern "C" {}
    C++强大背后
    移动优先与响应式Web设计
  • 原文地址:https://www.cnblogs.com/ainima/p/6331237.html
Copyright © 2020-2023  润新知