二叉排序树的构建与遍历

树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。二叉树的链式存储结构是一类重要的数据结构。
二叉树是每个结点最多只有两个子树的有序树。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^( i -1)个结点;深度为k的二叉树至多有2^k -1个结点;对任何一棵二叉树,如果其叶子结点数为n0,度为2的结点数为n2,则n0 = n2 + 1。

构造结点:

typedef struct _node{
    int data;
    struct _node *parent;//指向根结点
    struct _node *left;//指向左结点
    struct _node *right;//指向右结点
}node,*pnode;//*pnode为该结构体指针

申请结点:

pnode construct_node(int data){
    pnode temp = (pnode)malloc(sizeof(node));
    temp->data = data;
    temp->left = temp->right = temp->parent = NULL;
    return temp;
}

添加结点(构建二叉排序树):

pnode add_node(pnode root,pnode newnode)
{
    if(root == NULL)
        return newnode;
    pnode temp = root;
    while(temp != NULL)
    {
        if(newnode->data < temp->data)
            {
               if(temp->left == NULL)
                   {    
                        temp->left = newnode;
                        return root;
                    } 
                else 
                    temp = temp->left;   
           }
        else
            {
                if(temp->right == NULL)
                    {
                        temp->right = newnode;
                        return root
                    }
                else
                    temp = temp->right;

            }          
    }
}

中序、前序、后序遍历:

void visit(pnode temp)
{
	printf("%d \n", temp->data);
}


//中序遍历(左-根-右)(中序相当于排序)
void inorder(pnode root)
{
	if (root == NULL)
		return;
	pnode temp = root;
	if(temp != NULL)
	{			
		inorder(temp->left);//访问左子节点
		visit(temp);//访问根结点
		inorder(temp->right);//访问右子结点
	}
}

//前序遍历(根-左-右)
void preorder(pnode root)
{
	if (root == NULL)
		return;
	pnode temp = root;
	if (temp != NULL)
	{
		visit(temp);
		preorder(temp->left);
		preorder(temp->right);
	}
}


//后序遍历(左-右-根)
void postorder(pnode root)
{
	if (root == NULL)
		return;
	pnode temp = root;
	if (temp != NULL)
	{
		postorder(temp->left);
		postorder(temp->right);
		visit(temp);
	}
}

应用:随机生成10个数,通过构建二叉排序树和中序遍历对其进行排序。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//构造结点
typedef struct _node {
	int data;
	struct _node *parent;
	struct _node *left;
	struct _node *right;
}node,*pnode;

//申请一个结点
pnode construct_node(int data) {
	pnode temp = (pnode)malloc(sizeof(node));
	temp->data = data;
	temp->left = temp->right = temp->parent = NULL;
	return temp;
}
//添加结点(构建二插排序树)
pnode add_node(pnode root, pnode newnode) {
	if (root == NULL)
		return newnode;
	pnode temp = root;
	while (temp != NULL)
	{
		if (newnode->data < temp->data)
		{
			if (temp->left == NULL)
			{
				temp->left = newnode; 
				return root;
			}
			else
				temp = temp->left;
		}
		else
		{
			if (temp->right == NULL)
			{
				temp->right = newnode;
				return root;
			}
			else
				temp = temp->right;
		}

	}
}

void visit(pnode temp)
{
	printf("%d \n", temp->data);
}
//中序输出(左-根-右)(中序相当于排序)
void inorder(pnode root)
{
	if (root == NULL)
		return;
	pnode temp = root;
	if(temp != NULL)
	{			
		inorder(temp->left);//访问左子节点
		visit(temp);//访问根结点
		inorder(temp->right);//访问右子结点
	}
}

int main()
{
	pnode root = NULL;
	int num = 10;
	for (int i = 0; i < num; i++)
	{
		pnode temp = construct_node(rand()%100);
		printf("%d ", temp->data);
		root = add_node(root, temp);
	}
	printf("\n");
	inorder(root);//中序输出(左-根-右)
}

二叉排序树的构建与遍历
参考文章:二叉树各种遍历