laitimes

Data Structure - Tree codebase

author:Lamb's Debug

Traversal of trees

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct BiTNode
{
	int data;
	struct BiTNode*lchild, *rchild;
 };
typedef struct BiTNode BiTNode;
typedef struct BiTNode* BiTree;

void preOrder(BiTNode*root)
{
	if (root == NULL)
	{
		return;
	}
	printf("%d", root->data);
	preOrder(root->lchild);
	preOrder(root->rchild);

}
void inOrder(BiTNode *root)
{
	if (root == NULL)
	{
		return;
	}
	preOrder(root->lchild);
	printf("%d", root->data);
	preOrder(root->rchild);
}
void postOrder(BiTNode *root)
{
	if (root == NULL)
	{
		return;
	}
	preOrder(root->lchild);
	preOrder(root->rchild);
	printf("%d", root->data);
}
void main()
{
	BiTNode t1, t2, t3, t4, t5;
	memset(&t1, 0, sizeof(BiTNode));
	memset(&t2, 0, sizeof(BiTNode));
	memset(&t3, 0, sizeof(BiTNode));
	memset(&t4, 0, sizeof(BiTNode));
	memset(&t5, 0, sizeof(BiTNode));
	t1.data = 1;
	t2.data = 2;
	t3.data = 3;
	t4.data = 4;
	t5.data = 5;
	t1.lchild = &t2;
	t1.rchild = &t3;
	t2.lchild = &t4;
	t3.lchild = &t5;
	printf("preOrder\n");
	preOrder(&t1);
	printf("inOrder\n");
	inOrder(&t1);
	printf("postOrder\n");
	postOrder(&t1);
	printf("hello...\n");
	system("pause");
	return;
}           

Find the number of leaf nodes

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct BiTNode
{
	int data;
	struct BiTNode*lchild, *rchild;
 };
typedef struct BiTNode BiTNode;
typedef struct BiTNode* BiTree;

void preOrder(BiTNode*root)
{
	if (root == NULL)
	{
		return;
	}
	printf("%d", root->data);
	preOrder(root->lchild);
	preOrder(root->rchild);

}
void inOrder(BiTNode *root)
{
	if (root == NULL)
	{
		return;
	}
	preOrder(root->lchild);
	printf("%d", root->data);
	preOrder(root->rchild);
}
void postOrder(BiTNode *root)
{
	if (root == NULL)
	{
		return;
	}
	preOrder(root->lchild);
	preOrder(root->rchild);
	printf("%d", root->data);
}
int sum;
void  coutLeaf(BiTNode *T,int *sum)//递归里的指针做函数参数
{
	if (T != NULL)
	{
		if (T->lchild == NULL&&T->rchild == NULL)
		{
			(*sum)++;
		}


		if (T->lchild)
		{
			coutLeaf(T->lchild,sum);
		}
		if (T->rchild)
		{
			coutLeaf(T->rchild,sum);
		}
	}
}
void main()
{
	BiTNode t1, t2, t3, t4, t5;
	memset(&t1, 0, sizeof(BiTNode));
	memset(&t2, 0, sizeof(BiTNode));
	memset(&t3, 0, sizeof(BiTNode));
	memset(&t4, 0, sizeof(BiTNode));
	memset(&t5, 0, sizeof(BiTNode));
	t1.data = 1;
	t2.data = 2;
	t3.data = 3;
	t4.data = 4;
	t5.data = 5;
	t1.lchild = &t2;
	t1.rchild = &t3;
	t2.lchild = &t4;
	t3.lchild = &t5;
	{
		int mysum = 0;
		coutLeaf(&t1, &sum);
		printf("sum:%d\n", sum);
	}
	printf("hello...\n");
	system("pause");
	return;
}           

Find the height of the tree

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct BiTNode
{
	int data;
	struct BiTNode*lchild, *rchild;
 };
typedef struct BiTNode BiTNode;
typedef struct BiTNode* BiTree;


void inOrder(BiTNode *root)
{
	if (root == NULL)
	{
		return;
	}
	inOrder(root->lchild);
	printf("%d", root->data);
	inOrder(root->rchild);
}
int  Depth(BiTNode* T)
{
	int deptLeft = 0;
	int deptRight = 0;
	int deptval = 0;
	if (T == NULL)
	{
		deptval = 0;
		return  deptval;
	}
	deptLeft  = Depth(T->lchild);
	deptRight = Depth(T->rchild);
	deptval = 1 + (deptLeft > deptRight ? deptLeft : deptRight);
	return deptval;
}
void main()
{
	BiTNode t1, t2, t3, t4, t5;
	memset(&t1, 0, sizeof(BiTNode));
	memset(&t2, 0, sizeof(BiTNode));
	memset(&t3, 0, sizeof(BiTNode));
	memset(&t4, 0, sizeof(BiTNode));
	memset(&t5, 0, sizeof(BiTNode));
	t1.data = 1;
	t2.data = 2;
	t3.data = 3;
	t4.data = 4;
	t5.data = 5;
	t1.lchild = &t2;
	t1.rchild = &t3;
	t2.lchild = &t4;
	t3.lchild = &t5;

	printf("%d\n", Depth(&t1));
	printf("inOrder\n");
	inOrder(&t1);
	printf("hello...\n");
	system("pause");
	return;
}           

A copy of the tree

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct BiTNode
{
	int data;
	struct BiTNode*lchild, *rchild;
 };
typedef struct BiTNode BiTNode;
typedef struct BiTNode* BiTree;


void inOrder(BiTNode *root)
{
	if (root == NULL)
	{
		return;
	}
	inOrder(root->lchild);
	printf("%d", root->data);
	inOrder(root->rchild);
}
int  Depth(BiTNode* T)
{
	int deptLeft = 0;
	int deptRight = 0;
	int deptval = 0;
	if (T == NULL)
	{
		deptval = 0;
		return  deptval;
	}
	deptLeft  = Depth(T->lchild);
	deptRight = Depth(T->rchild);
	deptval = 1 + (deptLeft > deptRight ? deptLeft : deptRight);
	return deptval;
}
BiTNode *CopyTree(BiTNode* T)
{
	BiTNode *newNode = NULL;
	BiTNode *newLp = NULL;
	BiTNode *newRp = NULL;
	if (T == NULL)//递归结束标志
	{
		return NULL;
	}
	if (T->lchild != NULL)
	{
		newLp = CopyTree(T->lchild);
	}
	else
	{
		newLp = NULL;
	}
	if (T->rchild != NULL)
	{
		newRp = CopyTree(T->rchild);
	}
	else
	{
		newRp = NULL;
	}
	newNode = (BiTNode*)malloc(sizeof(BiTNode));
	if (newNode == NULL)
	{
		return  NULL;
	}
	newNode->lchild = newLp;
	newNode->rchild = newRp;

	newNode->data = T->data;
	return newNode;
}
void main()
{
	BiTNode t1, t2, t3, t4, t5;
	memset(&t1, 0, sizeof(BiTNode));
	memset(&t2, 0, sizeof(BiTNode));
	memset(&t3, 0, sizeof(BiTNode));
	memset(&t4, 0, sizeof(BiTNode));
	memset(&t5, 0, sizeof(BiTNode));
	t1.data = 1;
	t2.data = 2;
	t3.data = 3;
	t4.data = 4;
	t5.data = 5;
	t1.lchild = &t2;
	t1.rchild = &t3;
	t2.lchild = &t4;
	t3.lchild = &t5;

	printf("%d\n", Depth(&t1));
	{
		BiTNode *root = CopyTree(&t1);
		printf("inorder\n");
		inOrder(&t1);
		printf("hello...\n");
	}

	system("pause");
	return;
}           

#法创建树

BiTNode *CreateBiThrTree()
{
	BiTNode *node = NULL;
	BiTNode *pL = NULL;
	BiTNode *pR = NULL;
	char h;
	scanf("%c", &h);
	if (h == '#')
	{
		return NULL;
	}
	else
	{
		node = (BiTNode*)malloc(sizeof(BiTNode));
		memset(node, 0, sizeof(BiTNode));
		node->data = h;
		pL = CreateBiThrTree();
		if (pL != NULL)
		{
			node->lchild = pL;
		}
		else
		{
			node->rchild = NULL;
		}
		pR = CreateBiThrTree();
		if (pR != NULL)
		{
			node->rchild = pR;
		}
		else
		{
			node->rchild = NULL;
		}
	}
	return node;
}           

Binary tree clue

Status  InOrderThreading(BiThrTree *Thrt, BiThrTree T)
{
	*Thrt = (BiThrTree)malloc(sizeof(BiThrNode));
	if (!*Thrt)
		exit(OVERFLOW);
	(*Thrt)->LTag = Link;
	(*Thrt)->RTag = Thread;
	(*Thrt)->rchild = (*Thrt);
	if (!T)
		(*Thrt)->lchild = *Thrt;
	else
	{
		(*Thrt)->lchild = T;
		pre = (*Thrt);
		InThreading(T);
		pre->rchild = *Thrt;
		pre->RTag = Thread;
		(*Thrt)->rchild = pre;
	}
	return OK;

	
}
Status InOrderTraverse_Thr(BiThrTree T)
{
	BiThrTree p;
	p = T->lchild;
	while (p != T)
	{
		while(p->LTag==Link)
			p=p->lchild;
		if (!visit(p->data))
			return ERROP;
		while (p->RTag == Thread&&p->rchild != T)
		{
			p = p->rchild;
			visit(p->data);
		}
		p = p->rchild;
	}
	return OK;
}
Status InOrderTraverse_Thr(  BiThrTree T)
{
	BiThrTree p;
	p = T->lchild;
	while (p != T)
	{
		p = p->rchild;
	}
	return OK;
}