严蔚敏数据结构习题第六章

https://www.cnblogs.com/kangjianwei101/p/5243404.html

目录

36-47 二叉树

6.3,6.5,6.6,6.10,6.13,6.14,6.19,6.20,6.21,6.23,6.24,6.26,6.27, 6.28,6.29,6.30,6.36,6.41,6.42,6.43,6.47,6.49,6.56,6.60,6.62,6.65,6.69
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3

在这里插入图片描述
在这里插入图片描述

5

在这里插入图片描述

6

在这里插入图片描述

10 ??

在这里插入图片描述
(1)显然该二叉树为正则二叉树,没有度为1的结点,只有度为0的叶子和度为2的分支
按二叉树性质n0 = n2 + 1,因此度为2结点数为n - 1
于是该二叉树有2n-1个结点![v![](https://img-blog.csdnimg.cn/20210416100342295.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhbjI5Xw==,size_16,color_FFFFFF,t_70)

13,14

在这里插入图片描述

19 树->二叉树

在这里插入图片描述

在这里插入图片描述

20 森林->二叉树 线索化

在这里插入图片描述
在这里插入图片描述
方法:https://jingyan.baidu.com/article/19020a0a743851529d28421a.html
https://jingyan.baidu.com/article/cd4c2979abd74f346e6e60ed.html
树变成二叉树:从树的根结点开始,从上到下,看每一个结点,把你正在看的结点的孩子放在左子树,兄弟放在右子树。
将一个森林转换为二叉树:
将森林中的每棵树变为二叉树;2.因为转换所得的二叉树的根结点的右子树均为空,故可将各二叉树的根结点视为兄弟从左至右连在一起,就形成了一棵二叉树。
在这里插入图片描述

21 二叉树->森林

在这里插入图片描述
在这里插入图片描述

23

知中后求前:https://blog.csdn.net/WIFIfw/article/details/105312581
在这里插入图片描述二叉树的先根序列与等价树的先根序列相同,二叉树的中序序列对应着树的后根序列。
在这里插入图片描述

24

在这里插入图片描述
在这里插入图片描述

26

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

27 序列画树

在这里插入图片描述

28

29


在这里插入图片描述

30

在这里插入图片描述

36

在这里插入图片描述
在这里插入图片描述

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

typedef char TElemType;
typedef struct BiTNode
{
	TElemType data;
	struct BiTNode* lchild, * rchild;
}BiNode,*BiTree;

int BiTreeEmpty(BiTree T)//判断树是否为空
{
	return T == NULL ? 1 : 0;
}

int IsSimilar(BiTree t1, BiTree t2)
{
	if (BiTreeEmpty(t1) && BiTreeEmpty(t2))//如果两个树都是空
		return 1;
	else//非空
	{
		if (!BiTreeEmpty(t1) && !BiTreeEmpty(t2))
		{
			if (IsSimilar(t1->lchild, t2->lchild) && IsSimilar(t1->rchild, t2->rchild))
				return 1;
		}
	}
	return 0;
}

41

想知道*和&的差别:https://blog.csdn.net/weixin_43961780/article/details/106364838
编写递归算法,在二叉树中求位于先序序列中第k个位置的结点的值。
在这里插入图片描述在这里插入图片描述

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

typedef char TElemType;
typedef struct BiTNode
{
	TElemType data;
	struct BiTNode* lchild, * rchild;
}BiNode,*BiTree;

int PONodeK(BiTree T, int k, TElemType& e, int& i)//k是题目要求的第k个位置;i是用来计时;e存放节点的返回值
{
	if (T)
	{
		i++;
		if (i == k)//找到该位置
			e == T->data;
		else
		{
			PONodeK(T->lchild, k, e, i);
			PONodeK(T->rchild, k, e, i);
		}
	}
	return 1;
}

42

编写递归算法,计算二叉树中叶子结点的数目。
在这里插入图片描述
在这里插入图片描述

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

typedef char TElemType;
typedef struct BiTNode
{
	TElemType data;
	struct BiTNode* lchild, * rchild;
}BiNode,*BiTree;

int POLeafNodeNum(int& i, BiTree T)
{
	if (T)
	{
		if (!T->lchild && !T->rchild)
			i++;
		POLeafNodeNum(i, T->lchild);
		POLeafNodeNum(i, T->rchild);
	}
	return 1;
}
typedef char TElemType;
typedef struct BiTNode
{
	TElemType data;
	struct BiTNode* lchild, * rchild;
}BiNode, * BiTree;
int sum_42(BiTree T)
{
	int num = 0;
	if (T)
	{
		if (!T->lchild && !T->rchild)
			num++;
		else
		{
			num += sum_42(T->lchild);
			num += sum_42(T->rchild);
		}
	}
	return num;
}

43

编写递归算法,将二叉树中所有结点的左、右子树相互交换。
在这里插入图片描述
在这里插入图片描述

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

typedef char TElemType;
typedef struct BiTNode
{
	TElemType data;
	struct BiTNode* lchild, * rchild;
}BiNode,*BiTree;

int ExchangeBiTree(BiTree T)
{
	BiTree t;
	if (T)
	{
		t = T->lchild;
		T->lchild = T->rchild;
		T->rchild = t;
		ExchangeBiTree(T->lchild);
		ExchangeBiTree(T->rchild);
	}
	return 1;
}

47

编写按层次顺序(同一层自左至右)遍历二叉树的算法。
https://blog.csdn.net/lusic01/article/details/79819014
用队列的没有搞懂
在这里插入图片描述

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

typedef char TElemType;
typedef struct BiTNode
{
	TElemType data;
	struct BiTNode* lchild, * rchild;
}BiNode,*BiTree;

void LevelorderTraversal(BiTree T)
{
	int i, j;
	BiTree p[100];//树指针数组来模拟队列
	i = j = 0;//i指层,j指p的顺序下标
	if (T)
		p[j++] = T;
	while (i < j)
	{
		printf("%c", p[i]->data);
		if (p[i]->lchild)
			p[j++] = p[i]->lchild;
		if (p[i]->rchild)
			p[j++] = p[i]->rchild;
		i++;
	}
}

49 完全二叉树

编写算法判别给定二叉树是否为完全二叉树。
其他:https://blog.csdn.net/Lhj0616/article/details/78785439
在这里插入图片描述

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

typedef char TElemType;
typedef struct BiTNode
{
	TElemType data;
	struct BiTNode* lchild, * rchild;
}BiNode,*BiTree;

int BiTreeDepth(BiTree T)//求树的深度
{
	int LD, RD;
	if (T == NULL)
		return 0;
	else
	{
		LD = BiTreeDepth(T->lchild);
		RD = BiTreeDepth(T->rchild);
		return (LD >= RD ? LD : RD) + 1;
	}
}

int CompleteBiTree(BiTree& T)//用完全二叉树的性质
{
	int d;
	if (T)
	{
		d = BiTreeDepth(T->lchild) - BiTreeDepth(T->rchild);
		if (d < 0 || d>1)//左右子树的深度差值只能取0,1
			return 0;
		else
		{
			if (CompleteBiTree(T->lchild) && CompleteBiTree(T->rchild))
				return 1;
			else
				return 0;
		}
	}
	else return 1;
}

56 ?? 线索二叉树

Threaded BinaryTree线索二叉树
线索二叉树:https://blog.csdn.net/S_999999/article/details/86157532?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162029043216780255224783%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162029043216780255224783&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-86157532.first_rank_v2_pc_rank_v29&utm_term=%E7%BA%BF%E7%B4%A2%E4%BA%8C%E5%8F%89%E6%A0%91
图解线索二叉树: https://blog.csdn.net/weixin_44067399/article/details/107179420?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162029043216780255224783%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162029043216780255224783&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-2-107179420.first_rank_v2_pc_rank_v29&utm_term=%E7%BA%BF%E7%B4%A2%E4%BA%8C%E5%8F%89%E6%A0%91

试写一个算法,在先序后继线索二叉树中,查找给定结点*p在先序序列中的后继(假设二叉树的根结点未知)。并讨论实现此算法对存储结构有何要求?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

typedef int TElemType;
typedef enum PointerTag{Link,Thread};//Link==0,指针;Thread==1,线索
typedef struct BiThrNode
{
	TElemType data;
	struct BiThrNode* lchild, * rchild;
	PointerTag LTag, RTag;//左右标志
}BiThrNode, *BiThrTree;
//由先序遍历创建先序线索化链表
int PreThreading(BiThrTree& T, BiThrTree& pre)
{
	if (T)
	{
		if (!T->lchild)
		{
			T->LTag = Thread;
			T->lchild = pre;
		}
		if (pre && !pre->rchild)
		{
			pre->RTag = Thread;
			pre->rchild = T;
		}
		pre = T;
		if (T->LTag == Link)
			PreThreading(T->lchild, pre);
		if (T->RTag == Link)
			PreThreading(T->rchild, pre);
	}
	return 1;
}

int PreOderThreading(BiThrTree& TT, BiThrTree T)
{
	//先序遍历二叉树T,并将其先序线索化,TT指向头节点
	BiThrTree pre;
	if (!(TT = (BiThrTree)malloc(sizeof(BiThrNode))))
		return 0;
	TT->LTag = Thread;
	TT->RTag = Link;
	TT->lchild = TT;//左子树回指
	if (!T)
		TT->rchild = TT;//若二叉树为空,右子树回指
	else
	{
		TT->rchild = T;
		pre = TT;
		PreThreading(T, pre);//先序遍历进行先序线索化
		pre->rchild = T;//最后一个结点线索化
		pre->RTag = Thread;
		TT->lchild = pre;
	}
	return 0;
}

//从二叉线索树上任一结点q开始查找结点*p。如果找到,将*p的后继结点指针存于q中,返回1; 否则返回0
int Find(BiThrTree& q, TElemType* p)
{
	BiThrTree pt = q;
	if (!pt)
		return 0;
	if (pt->data == *p)
	{
		if (pt->LTag == Link)
			q = pt->lchild;
		else
			q = pt->rchild;
		return 1;
	}
	pt = q->rchild;
	while (pt != q && pt->data != *p)
	{
		if (pt->LTag == Link)
			pt = pt->lchild;
		else
			pt = pt->rchild;
	}
	if (pt == q)
		return 0;
	if (pt->data == *p)
	{
		if (pt->LTag == Link)
			q = pt->lchild;
		else
			q = pt->rchild;
	}
	return 0;
}

60 孩子-兄弟

孩子-兄弟链:https://blog.csdn.net/Feynman1999/article/details/72771432/
试编写算法,对一棵以孩子-兄弟链表表示的树统计叶子的个数。
在这里插入图片描述

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


typedef struct CSNode
{
	ElemType data;
	struct CSNode* firstchild, * nextsibling;
}CSNode,*CSTree;

int LeafNum(CSTree& T)
{
	if (T)
	{
		if (!T->firstchild)
			return 1 + LeafNum(T->nextsibling);
		else
			return LeafNum(T->firstchild) + LeafNum(T->nextsibling);
	}
	else
		return 0;
}

62

关于孩子兄弟链:https://blog.csdn.net/Feynman1999/article/details/72771432/
对以孩子-兄弟链表表示的树编写计算树的深度的算法。
在这里插入图片描述

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


typedef struct CSNode
{
	ElemType data;
	struct CSNode* firstchild, * nextsibling;
}CSNode,*CSTree;

int Depth(CSTree& T)
{
	int d1, d2;
	if (T)
	{
		d1 = 1 + Depth(T->firstchild);
		d2 = Depth(T->nextsibling);
		return d1 > d2 ? d1 : d2;
	}
	else
		return 0;
}

65 ?

已知一棵二叉树的前序序列和中序序列分别存于两个一维数组中,试编写算法建立该二叉树的二叉链表。
https://blog.csdn.net/HUST_LHC/article/details/105259465
https://blog.csdn.net/qq_43661234/article/details/101538803

#include <stdio.h>
#include <stdlib.h>
typedef int elemtype;
typedef struct BTNode {
    elemtype data;
    struct BTNode* left, * right;
}BTNode, * BiTree;

//假设数组AB分别存储前序序列,中序序列
//l1 r1表示A[](先序序列)的最左端和最右端下标;l2,r2同理
BiTree creat(elemtype A[], elemtype B[], int l1, int r1, int l2, int r2)
{
    BiTree root = (BiTree)malloc(sizeof(BTNode));
    root->data = A[l1];
    // printf("%d\n",root->data);
    int i = l2;
    for (i = l2; B[i] != A[l1]; i++);  //在中序遍历序列中查找根结点位置
    int llen = i - l2;  //左子树长度
    int rlen = r2 - i;    //右子树长度
    if (llen > 0)
        root->left = creat(A, B, l1 + 1, l1 + llen, l2, llen + l2 - 1);
    else
        root->left = NULL;
    if (rlen > 0)
        root->right = creat(A, B, r1 - rlen + 1, r1, r2 - rlen + 1, r2);
    else
        root->right = NULL;

    return root;
}

、、、

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
int SearchNum(int num,int *array,int length)
{
	for(int i=0; i<length; i++)
	if(array[i] == num)
	return i;
	return -1;
	//没有找到。
}

struct TreeNode* buildTree(int* pre, int prelen, int* mid, int midlen)
{
    struct TreeNode* want;
    want=(struct TreeNode*)malloc(sizeof(struct TreeNode));
	if(prelen==0&&midlen==0)
	return NULL;
	want->val=pre[0];
	int rootposition=0;
	if(pre[0]==mid[0])
	want->left=NULL;
	else
	{
		rootposition=SearchNum(want->val,mid,midlen);
		want->left=buildTree(pre+1,rootposition,mid,rootposition);
	}
	if(pre[0]==mid[midlen-1])
	want->right=NULL;
	else
	{
		want->right=buildTree(pre+rootposition+1,prelen-rootposition-1,mid+rootposition+1,midlen-rootposition-1);
	}
	return want;	
}

69

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

typedef char TElemType;
typedef struct BiTNode
{
	TElemType data;
	struct BiTNode* lchild, * rchild;
}BiNode, * BiTree;

//逆中序遍历
void printfBiTree(BiTree H, int i)//i表示相对根节点走的步数,层序信息
{
	int j;
	if (H)
	{
		printfBiTree(H->rchild, i + 1);//先右
		for (j = 1; j < 2 * i; j++)//控制孔哥格数
			printf(" ");
		printf("%c\n", H->data);
		printfBiTree(H->lchild, i + 1);//再左
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值