• 二叉树删除,重建,交换


    1.删除以元素值x为根结点的子树,并释放其空间

    #include "stdafx.h"
    #include<iostream>
    using namespace std;
    typedef struct BTreeNode
    {
    	int data;
    	struct BTreeNode *lchild,*rchild;
    }BTree;
    int _tmain(int argc, _TCHAR* argv[])
    {
    	return 0;
    }
    void DeleteXTree (BTree *bt)//删除以bt为根的字树
    {
    	DeleteXTree(bt->lchild);
    	DeleteXTree(bt->rchild);
    	free(bt);
    }
    void Search(BTree *bt,int x)
    {
    	if(bt)
    	{
    		if(bt->data==x)DeleteXTree(bt);
    		else
    		{
    		Search(bt->lchild,x);
    		Search(bt->rchild,x);
    		}
    	}
    }
    

     2.交换左右孩子结点

    1)递归方法,中序遍历不适合本题

    void exchange(BTree *bt)
    {
    	if(bt)
    	{
    		BTree *s;
    		s=bt->lchild;bt->lchild=bt->rchild;bt->rchild=s;//左右子女交换
    		exchange(bt->lchild);//交换左子树上所有结点的左右子树
    		exchange(bt->rchild);//交换右子树上所有结点的左右子树
    	}
    }
    

     2)非递归方法

    void exchange(BTree *bt)
    {
    	int top=-1;//栈顶指针
    	BTree *s[100],*p;
    	if(bt)
    	{
    		s[++top]=bt;//入栈
    		while(top>-1)
    		{
    			bt=s[top--];
    			if(bt->lchild||bt->rchild)
    			{
    			    p=bt->lchild;bt->lchild=bt->rchild;bt->rchild=p;//左右子女交换
    			}
    		
    			if(bt->lchild)s[++top]=bt->lchild;//交换左子树上所有结点的左右子树
    			if(bt->rchild)s[++top]=bt->rchild;//交换右子树上所有结点的左右子树
    		}	
    	}
    }
    

     3.前序和中序建立二叉树

    #include "stdafx.h"
    #include<iostream>
    using namespace std;
    typedef struct BTreeNode
    {
    	int data;
    	struct BTreeNode *lchild,*rchild;
    }BTree;
    int _tmain(int argc, _TCHAR* argv[])
    {
    	return 0;
    }
    void PreInCreate(BTree *root,int pre[100],int in[100],int l1,int h1,int l2,int h2)//l1,h1,l2,h2为两个序列的首尾元素下标
    {
    	root=(BTree*)malloc(sizeof(BTreeNode));
    	root->data=pre[l1];//根结点
    	int i;
    	for(i=l2;i<=h2;i++)if(in[i]==pre[l1])break;//找到中序的根结点,分解左右子树
    	if(i==l2)//无左子树
    	{
    		root->lchild=NULL;
    	}
    	else
    	{
    		PreInCreate(root->lchild,pre,in,l1+1,l1+(i-l2),l2,i-1);//建立左子树
    	}
    	if(i==h2)//无右子树
    	{
    		root->rchild=NULL;
    	}
    	else
    	{
    		PreInCreate(root->rchild,pre,in,l1+(i-l2)+1,h1,i+1,h2);//建立右子树
    	}
    }
    

     4.中序和后续建立二叉树

    void InPostCreate(BTree *root,int in[100],int post[100],int l1,int h1,int l2,int h2)//l1,h1,l2,h2为两个序列的首尾元素下标
    {
    	root=(BTree*)malloc(sizeof(BTreeNode));
    	root->data=post[h2];//根结点
    	int i;
    	for(i=l1;i<=h1;i++)if(in[i]==post[h2])break;//找到中序的根结点,分解左右子树
    	if(i==l1)//无左子树
    	{
    		root->lchild=NULL;
    	}
    	else
    	{
    		InPostCreate(root->lchild,in,post,l1,i-1,l2,l2+i-l1-1);//建立左子树
    	}
    	if(i==h1)//无右子树
    	{
    		root->rchild=NULL;
    	}
    	else
    	{
    		InPostCreate(root->rchild,in,post,i+1,h1,l2+i-l1,h2-1);//建立右子树
    	}
    }
    

    5.前序和后序建立二叉树

    分析:前序的第一个是根结点,若无其他节点,则该结点是为叶子。否则该结点必有左右子树,且根结点的第一个结点就是左子树的根,到后序序列中去寻找这个左子树的根,它将后序序列分为两部分:左部分(包括所查到的结点)是二叉树的左子树(可能为空),右部分(除去最后的根结点)则是右子树(可能为 空)。这样,在确定根结点后,可递归确定左右子树。

    void PrePostCreate(BTree *root,int pre[100],int post[100],int l1,int h1,int l2,int h2)//l1,h1,l2,h2为两个序列的首尾元素下标
    {
    	BTree *p=root;
    	if(l1<=h1)
    	{
    		p=(BTree*)malloc(sizeof(BTreeNode));
    		p->data=pre[l1];//根结点
    		if(l1==h1)//只有一个叶结点的二叉树
    		{
    			p->lchild=p->rchild=NULL;
    		}
    		else
    		{
    			int i;
    			for(i=l2;i<=h2;i++)
    			{
    				if(post[i]==pre[l1+1])break;
    			}
    			int L=i-l2+1;//左子树结点数
    			PrePostCreate(root->lchild,pre,post,l1+1,l1+L,l2,i);//建立左子树
    			PrePostCreate(root->lchild,pre,post,l1+L+1,h1,i+1,h2-1);//建立右子树	
    		}
    	}
    }
    
  • 相关阅读:
    webpack --- 详解
    vue 配置文件详解
    webstorm添加vue模板支持
    golang制作系统服务
    PMBOK 项目管理 九大知识领域和五大流程
    人工智能——数据、信息与知识
    阿里云大数据三次技术突围:Greenplum、Hadoop和“飞天”
    海量数据处理利器greenplum——初识
    CentOS如何禁用root本地或远程ssh登录
    Tomcat学习—Tomcat的简介和目录以及配置文件介绍(Windows环境)
  • 原文地址:https://www.cnblogs.com/tgkx1054/p/2640752.html
Copyright © 2020-2023  润新知