二叉树

在这里插入图片描述
二叉树递归遍历

// 二叉树.cpp : 定义控制台应用程序的入口点。

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

//
//
//
typedef struct BINARYNODE {
	char ch;
	struct BINARYNODE* lchild;
	struct BINARYNODE* rchild;

}BinaryNode;

//递归遍历
void recursion(BinaryNode *root)
{
	if (root == NULL)
		return;
	
	//先序遍历
	//printf("%c", root->ch);//遍历根
	//recursion(root->lchild);//遍历左
	//recursion(root->rchild);//遍历右

	//中遍历
	recursion(root->lchild);
	printf("%c", root->ch);
	recursion(root->rchild);

	//后遍历
	//printf("%c", root->ch);
	//recursion(root->rchild);
	//recursion(root->lchild);
}

//计算叶子节点
void calLeafNum(BinaryNode*root, int*leafNum)
{
	if (root == NULL)
		return;
	if (root->lchild == NULL&&root->rchild == NULL)
	{
		(*leafNum)++;
	}
	calLeafNum(root->lchild, leafNum);//左子树叶子节点数
	calLeafNum(root->rchild, leafNum);//右子树叶子节点数

}

//求二叉树的高度
int CaculateTreeDepth(BinaryNode* root) {

	if (root == NULL) {
		return 0;
	}

	int depth = 0;
	//求左子树的高度
	int leftDepth = CaculateTreeDepth(root->lchild);
	int rightDepth = CaculateTreeDepth(root->rchild);
	depth = leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;

	return depth;
}

//拷贝二叉树
BinaryNode* copyBinaryTree(BinaryNode* root) {
	if (root == NULL) {
		return 0;
	}

	BinaryNode*lchild =copyBinaryTree(root->lchild);
	BinaryNode*rchild =copyBinaryTree(root->rchild);
	//创建节点
	BinaryNode*newnode = (BinaryNode*)malloc(sizeof(BinaryNode));
	newnode->ch = root->ch;
	newnode->lchild = lchild;
	newnode->rchild =rchild;

	return newnode;
}

//释放二叉树内存
void freeBinaryTree(BinaryNode* root)
{
	if (root == NULL) {
		return;
	}

		freeBinaryTree(root->lchild);
		freeBinaryTree(root->rchild);
		free(root);
		root = NULL;
}


void crrateBinaryLink()
{
	BinaryNode node1 = { 'A',NULL,NULL };	//		A
	BinaryNode node2 = { 'B',NULL,NULL };	//	B		F
	BinaryNode node3 = { 'C',NULL,NULL };	// C			G
	BinaryNode node4 = { 'D',NULL,NULL };	//D	 E	       H
	BinaryNode node5 = { 'E',NULL,NULL };
	BinaryNode node6 = { 'F',NULL,NULL };
	BinaryNode node7 = { 'G',NULL,NULL };
	BinaryNode node8 = { 'H',NULL,NULL };

	//建立节点关系
	node1.lchild = &node2;
	node1.rchild = &node6;
	node2.rchild = &node3;
	node3.lchild = &node4;
	node3.rchild = &node5;
	node6.rchild = &node7;
	node7.lchild = &node8;

	//recursion(&node1);

	//int leafNum=0;
	//calLeafNum(&node1, &leafNum);
	//	printf("叶子数:%d",leafNum);

	//int depth = CaculateTreeDepth(&node1);
	//printf("树的高度为:%d\n", depth);

	BinaryNode*root = copyBinaryTree(&node1);
	recursion(root);
	freeBinaryTree(root);
}



int main()
{
	crrateBinaryLink();

	printf("\n");
	system("pause");
	return 0;
}
```c

二叉树非递归遍历

// 二叉树.cpp : 定义控制台应用程序的入口点。

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

#define FALSE 0
#define TRUE  1
//链式栈的结点
typedef struct LINKNODE {
	struct LINKNODE* next;
}LinkNode;

//链式栈
typedef struct LINKSTACK {
	LinkNode head;
	int size;
}LinkStack;

LinkStack* Init_LinkStack() {

	LinkStack* stack = (LinkStack*)malloc(sizeof(LinkStack));
	stack->head.next = NULL;
	stack->size = 0;

	return stack;
}
//入栈
void Push_LinkStack(LinkStack* stack, LinkNode* data) {

	if (stack == NULL) {
		return;
	}

	if (data == NULL) {
		return;
	}

	data->next = stack->head.next;
	stack->head.next = data;
	stack->size++;
}
//出栈
void Pop_LinkStack(LinkStack* stack) {
	if (stack == NULL) {
		return;
	}

	if (stack->size == 0) {
		return;
	}

	//第一个有效结点
	LinkNode* pNext = stack->head.next;
	stack->head.next = pNext->next;

	stack->size--;
}
//返回栈顶元素
LinkNode* Top_LinkStack(LinkStack* stack) {
	if (stack == NULL) {
		return NULL;
	}
	if (stack->size == 0) {
		return NULL;
	}
	return stack->head.next;
}
//返回栈元素的个数
int Size_LinkStack(LinkStack* stack) {
	if (stack == NULL) {
		return -1;
	}
	return stack->size;
}
//清空栈
void Clear_LinkStack(LinkStack* stack) {
	if (stack == NULL) {
		return;
	}
	stack->head.next = NULL;
	stack->size = 0;
}
//销毁栈
void FreeSpace_LinkStack(LinkStack* stack) {
	if (stack == NULL) {
		return;
	}
	free(stack);
}


typedef struct BINARYNODE {
	char ch;
	struct BINARYNODE* lchild;
	struct BINARYNODE* rchild;

}BinaryNode;

//放入栈的节点
typedef struct TREESTACKNODE {
	LinkNode node;
	BinaryNode* root;
	int flag;

}TreeStackNode;

//创建栈中节点
TreeStackNode*  createTreeStackNode(BinaryNode* root,int flag)
{
	TreeStackNode*newnode =(TreeStackNode*) malloc(sizeof(TreeStackNode));
	newnode->root = root;
	newnode->flag = flag;

	return newnode;
}

//非递归遍历
void Traversal(BinaryNode* root)
{
	LinkStack*stack = Init_LinkStack();

	Push_LinkStack(stack,(LinkNode*)createTreeStackNode(root,FALSE));

	while (Size_LinkStack(stack)>0)
	{
		TreeStackNode* node = (TreeStackNode*)Top_LinkStack(stack);//弹出栈顶元素
		Pop_LinkStack(stack);

		if (node->root == NULL)
			continue;
			
		if (node->flag == TRUE)//遍历到一个节点,否则将下一个节点入栈
			printf("%c", node->root->ch);
		
		else//入栈顺序与遍历顺序相反
		{
			//先序遍历
			Push_LinkStack(stack, (LinkNode*)createTreeStackNode(node->root->rchild, FALSE));//右节点
			Push_LinkStack(stack, (LinkNode*)createTreeStackNode(node->root->lchild, FALSE));//左节点

			node->flag = TRUE;
			Push_LinkStack(stack, (LinkNode*)node);
			
		}
	}

}


void crrateBinaryLink()
{
	BinaryNode node1 = { 'A',NULL,NULL };	//		A
	BinaryNode node2 = { 'B',NULL,NULL };	//	B		F
	BinaryNode node3 = { 'C',NULL,NULL };	// C			G
	BinaryNode node4 = { 'D',NULL,NULL };	//D	 E	       H
	BinaryNode node5 = { 'E',NULL,NULL };
	BinaryNode node6 = { 'F',NULL,NULL };
	BinaryNode node7 = { 'G',NULL,NULL };
	BinaryNode node8 = { 'H',NULL,NULL };

	//建立节点关系
	node1.lchild = &node2;
	node1.rchild = &node6;
	node2.rchild = &node3;
	node3.lchild = &node4;
	node3.rchild = &node5;
	node6.rchild = &node7;
	node7.lchild = &node8;

	Traversal(&node1);

}


int main()
{
	crrateBinaryLink();

	printf("\n");
	system("pause");
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值