数据结构——遍历二叉树和线索二叉树,树和森林

目录

1.遍历的算法实现

1.先序遍历 

代码示例:

 

 2.中序遍历

代码示例:

 3.后序遍历

代码示例:

4.遍历算法的分析 

 

2.遍历二叉树的非递归算法

1.中序遍历非递归算法 

代码示例:

 3.二叉树的层次遍历

代码示例:

 

4.二叉树遍历算法的应用

1.二叉树的建立 

代码示例:

 2.复制二叉树

 代码示例:

3.计算二叉树深度 

代码示例:

 4.计算二叉树结点总数

代码示例:

 

5.计算二叉树叶子结点数 

代码示例:

 5.线索二叉树

1.线索二叉树的结构 

代码示例:

 2.先序线索二叉树

3.中序线索二叉树 

4.后序线索二叉树 

5.练习 

6.树和森林 

1.树的存储结构 

1.双亲表示法 

2.孩子链表 

3.孩子兄弟表示法 

2.树和二叉树的转换 

3.将二叉树转换为树 

7.树和森林的遍历


1.遍历的算法实现

1.先序遍历 

fafc6908807e44518c364a8a19b1f5ba.png

69678e22193e4c1db8a898f8b0a55ebb.png

ebb34f71d35b4728b2997519b25a9971.png

代码示例:

 

int preordertraverse(bitree t)
{
	if(t == NULL) return 0;
	else{
		printf("%d\t",t -> data);
		preordertraverse(t -> lchild);
		preordertraverse(t -> rchild);
	}
}

void pre(bitree t)
{
	if(t != NULL)
	{
		printf("%d\t",t -> data);
		pre(t -> lchild);
		pre(t -> rchild);
	}
}

 2.中序遍历

93194a14ab1b469d82012b46096a898b.png

fcdb27438bcc4d3682ccbf39badf158b.png

代码示例:

int inordertraverse(bitree t)
{
	if(t == NULL) return 0;
	else{
		inordertraverse(t -> lchild);
		printf("&d\t",t -> data);
		inordertraverse(t -> rchild);
	}
}

 3.后序遍历

497cf6dc808f4b0aa4e83fde78dcd919.png

1791c479cb8b48ffbd5404ef7edb54a8.png

代码示例:

int postordertraverse(bitree t)
{
	if(t == NULL) return 0;
	else{
		postordertraverse(t -> lchild);
		postordertraverse(t -> rchild);
		printf("%d\t",t -> data);
	}
}

4.遍历算法的分析 

 

cd156213da22440f9ad2a14bff4549c9.png

aac0282e8e254113aa0a5b787169c280.png

6719152c9107452f9fad855fd0e01f36.png

2.遍历二叉树的非递归算法

1.中序遍历非递归算法 

f66574e1debc43e095dc658d5e661ccc.png

4d5d51bd77974bbc87c416def237782e.png

925bef5487364737af8fab585029ab30.png

2c51c71272fb487aa2544fc18353d553.png

ce80c4bfd4d74af596dcb972108f85ed.png

eeee6682dc6b493cb3379d1e0963b6df.png

代码示例:

int inordertraverse2(bitree t)
{
	bitree p,q;
	initstack(s);
	p = t;
	while(p || !stackempty(s))
	{
		if(p != NULL)
		{
			push(s,p);
			p = p -> lchild;
		}
		else{
			pop(s,q);
			//使栈顶元素弹出,并且将栈顶元素的地址赋给q
			printf("%c",q -> data),p = q -> rchild;
		}
		return 1;
	}
}

 3.二叉树的层次遍历

926c70c3a82c45f287f1aa9bf91bb8b8.png

85c59ea0882e4095b556c703457179fd.png

e1958a411f8847bf878045f5501fb0be.png

903887185d624e42bd25d3395af990d2.png

6b818d3801424dbbb24a3c2229a0e8f7.png

9ddacc42cab64108a29d1860992671cf.png

代码示例:

 

typedef struct{
	btnode data[100];
	int front,rear;
}sqqueue;

void levelorder(btnode *b)
{
	btnode *p;
	sqqueue *qu;
	initqueue(qu);
	enqueue(qu,b);
	while(!queueempty(qu))
	{
		dequeue(qu,p);
		printf("%c",p -> data);
		if(p -> lchild != NULL) enqueue(qu,p -> lchild);
		if(p -> rchild != NULL) enqueue(qu,p -> rchild);
	}
}

4.二叉树遍历算法的应用

1.二叉树的建立 

c016951a15fb4e51af02adb503d08879.png

21c494ccb63f41d7a0e51333d704c617.png

c5bb5ed9b3be498684f50c4f0095b594.png

代码示例:

int createbitree(bitree &t)
{
	cin >> ch;
	if(ch == '#') t = NULL;
	else{
		t = new bitnode;
		t -> data = ch;
		createbitree(t -> lchild);
		createbitree(t -> rchild);
	}
	return 1;
}

 2.复制二叉树

982d6a90b716481db0c78f177ca2f980.png

 代码示例:

int copy(bitree t,bitree &newt)
{
	if(t == NULL)
	{
		newt = NULL;
		return 0;
	}
	else{
		newt = new bitnode;
		newt -> data = t -> data;
		copy(t -> lchild,newt -> lchild);
		copy(t -> rchild,newt -> lchild);
	}
}

3.计算二叉树深度 

321263016a1b4578b12c027275382418.png

代码示例:

int depth(bitree t)
{
	if(t == NULL) return 0;
	else{
		int m,n;
		m = depth(t -> lchild);
		n = depth(t -> rchild);
		if(m > n) return m + 1;
		else return n + 1;
	}
}

 4.计算二叉树结点总数

9fbbb895865c4f479315f90bfa0b84f9.png

代码示例:

 

int nodecount(bitree t)
{
	if(t == NULL) return 0;
	else{
		return nodecount(t -> lchild) + nodecount(t -> rchild) + 1;
	}
}

5.计算二叉树叶子结点数 

9771b582b89c49a183ad73c4f6b442e1.png

代码示例:

int leafcount(bitree t)
{
	if(t == NULL) return 0;
	if(t -> lchild == NULL && t -> rchild == NULL) return 1;
	else return leafcount(t -> lchild) + leafcount(t -> rchild);
}

 5.线索二叉树

bb0b2824402a4af6a570516840c4fb2b.png

445fa532c4ef4929a2144251db22f348.png

5cc54f1232a342ca8749b2d6d56501ba.png

25cc24506a464950ae2bbec033675087.png

044ca47bb6c2402d9a4df5f5ce260522.png

3808e823b78f4fae9b637683781f25f5.png

1.线索二叉树的结构 

7cba2174004f450880e59f5ff4829843.png

代码示例:

typedef struct bithrnode{
	int data;
	int ltag,rtag;
	struct bithrnode *lchild,*rchild;
}bithrnode,*bithrtree;

 2.先序线索二叉树

81347271a2e94f518bb2d3538c9d2796.png

3.中序线索二叉树 

2f8ca093e9a44be9bf982a81c776a4d7.png

4.后序线索二叉树 

ccbbe06e2ce14b9eb18e87c277628e2a.png

5.练习 

16ee657a95824cfdb6d21249757c1a7b.png

92ea03e792fc45c9b6f78ba28929187d.png

6.树和森林 

6854da0bfc3441ee8753a6609678ecd2.png

1.树的存储结构 

1.双亲表示法 

348e9ac43b844399863533c911d4ebc6.png

b60513672ae84806acf6bde7e1a16747.png

2.孩子链表 

4f17ad62bc94453891760de6c22e19bf.png

81c125f9fb6d4945bde84ba612cbab25.png

a77b1a5fb75440ecb3b3ce3ebdf269c9.png

eafe682694484826bd9777def5b42694.png

3.孩子兄弟表示法 

b71056328b15455bb40f6404f970a329.png

215d350a102346feb4f4835499f050bc.png

2.树和二叉树的转换 

55a4538f587a49a387d730168df7ad2b.png

0811ab99f5274557aed325465c375f5c.png

85b64e3de32f4b35b9475ad125e9e6c0.png

811bb68ea7fc447986031a3083fa4394.png

3.将二叉树转换为树 

e0a63cdf1ae048c3b6bde8311b03940c.png

81d81da1eb72443b8a1f6f6321b49904.png

 

03020388d9f745379af6fea7b934385a.png

1949a8f057b24c4fb4219ceafafce7de.png

b1467793aed44d3abc57dd9bf2362fe8.png

ac746065e9ec47eaa38d0dffb4fd8fe1.png

7.树和森林的遍历

355879a716184f6ab59dc8ec81fa9bfa.png

 4f74efd2dcb94e21927f75a0bd84a6ae.png

81631c5013af4b81a7e8b363e3b8cdea.png

c430052d7aeb480ea06949237a26bddd.png

d0f9049bf17e44ffb80c847d0aee8550.png

8.总的代码

typedef struct binode{
	int data;
	struct binode *lchild,*rchild;
}binode,*bitree;

int preordertraverse(bitree t)
{
	if(t == NULL) return 0;
	else{
		printf("%d\t",t -> data);
		preordertraverse(t -> lchild);
		preordertraverse(t -> rchild);
	}
}

void pre(bitree t)
{
	if(t != NULL)
	{
		printf("%d\t",t -> data);
		pre(t -> lchild);
		pre(t -> rchild);
	}
}

int inordertraverse(bitree t)
{
	if(t == NULL) return 0;
	else{
		inordertraverse(t -> lchild);
		printf("&d\t",t -> data);
		inordertraverse(t -> rchild);
	}
}

int postordertraverse(bitree t)
{
	if(t == NULL) return 0;
	else{
		postordertraverse(t -> lchild);
		postordertraverse(t -> rchild);
		printf("%d\t",t -> data);
	}
}

int inordertraverse2(bitree t)
{
	bitree p,q;
	initstack(s);
	p = t;
	while(p || !stackempty(s))
	{
		if(p != NULL)
		{
			push(s,p);
			p = p -> lchild;
		}
		else{
			pop(s,q);
			//使栈顶元素弹出,并且将栈顶元素的地址赋给q
			printf("%c",q -> data),p = q -> rchild;
		}
		return 1;
	}
}

typedef struct{
	btnode data[100];
	int front,rear;
}sqqueue;

void levelorder(btnode *b)
{
	btnode *p;
	sqqueue *qu;
	initqueue(qu);
	enqueue(qu,b);
	while(!queueempty(qu))
	{
		dequeue(qu,p);
		printf("%c",p -> data);
		if(p -> lchild != NULL) enqueue(qu,p -> lchild);
		if(p -> rchild != NULL) enqueue(qu,p -> rchild);
	}
}

int createbitree(bitree &t)
{
	cin >> ch;
	if(ch == '#') t = NULL;
	else{
		t = new bitnode;
		t -> data = ch;
		createbitree(t -> lchild);
		createbitree(t -> rchild);
	}
	return 1;
}

int copy(bitree t,bitree &newt)
{
	if(t == NULL)
	{
		newt = NULL;
		return 0;
	}
	else{
		newt = new bitnode;
		newt -> data = t -> data;
		copy(t -> lchild,newt -> lchild);
		copy(t -> rchild,newt -> lchild);
	}
}

int depth(bitree t)
{
	if(t == NULL) return 0;
	else{
		int m,n;
		m = depth(t -> lchild);
		n = depth(t -> rchild);
		if(m > n) return m + 1;
		else return n + 1;
	}
}

int nodecount(bitree t)
{
	if(t == NULL) return 0;
	else{
		return nodecount(t -> lchild) + nodecount(t -> rchild) + 1;
	}
}

int leafcount(bitree t)
{
	if(t == NULL) return 0;
	if(t -> lchild == NULL && t -> rchild == NULL) return 1;
	else return leafcount(t -> lchild) + leafcount(t -> rchild);
}

typedef struct bithrnode{
	int data;
	int ltag,rtag;
	struct bithrnode *lchild,*rchild;
}bithrnode,*bithrtree;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏箱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值