二叉树小结

二叉树小结

基础准备:结点信息与先序建二叉树

typedef struct TreeNode
{
	char ch;
	struct TreeNode* lchild, * rchild;

}TreeNode, * BiTree;
char c;
void CreatBiTree(BiTree &T)
{
	cin >> c;
	if (c == '#') T = NULL;//根据要求,如果是遇到0表示空结点,就将#改为0
	else 
    {
		T = new TreeNode;
		T->ch = c;
		CreatBiTree(T->lchild);
		CreatBiTree(T->rchild);
	}

	return;
}

一、二叉树的遍历

1. 先序遍历

1.1 递归
void PreTraverse(BiTree &T)
{
	if (T == NULL) return;
	else 
    {
		cout << T->ch << endl;
		PreTraverse(T->lchild);
		PreTraverse(T->rchild);
	}
	return;
}
1.2 非递归
void _PreTraverse(BiTree T)
{
	stack<BiTree> S;

	TreeNode* p = T;
	TreeNode* q = NULL;//new TreeNode;

	while (p || !S.empty())
	{
		if (p)
		{
			cout << p->ch << endl;
			S.push(p);
			p = p->lchild;
		}
		else
		{
			q = S.top(); S.pop();
			p = q->rchild;
		}
	}
	return;
}

2. 中序遍历

2.1 递归
void InTraverse(BiTree& T)
{
	if (T == NULL) return;
	else 
    {
		InTraverse(T->lchild);
		cout << T->ch << endl;
		InTraverse(T->rchild);
	}
	return;
}
2.2 非递归
void _InTraverse(BiTree T)
{
	stack<BiTree> S;

	TreeNode* p = T;
	TreeNode* q = NULL;//new TreeNode;

	while (p || !S.empty())
	{
		if (p)
		{
			S.push(p);
			p = p->lchild;
		}
		else
		{
			q = S.top(); S.pop();
			cout << q->ch << endl;
			p = q->rchild;
		}
	}

	return;
}

3. 后序遍历

3.1 递归
void PosTraverse(BiTree& T)
{
	if (T == NULL) return;

	else 
    {
		PosTraverse(T->lchild);
		PosTraverse(T->rchild);
		cout << T->ch << endl;
	}

	return;
}
3.2 非递归
void _PosTraverse(BiTree T)
{
	stack<BiTree> S;

	TreeNode* p = T;
	TreeNode* r = NULL;//new TreeNode;

	while (p || !S.empty())
	{
		if (p)
		{
			S.push(p);
			p = p->lchild;
		}
		else
		{
			p = S.top();
			if (p->rchild && p->rchild != r) p = p->rchild;
			else
			{
				S.pop();
				cout << p->ch << endl;
				r = p; 
                p = NULL;
			}
		}
	}

	return;
}

4. 层序遍历

void levelorder(BiTree &T)
{
	queue <BiTree> q;
	TreeNode* p = T;
	q.push(p);
	while (p && !q.empty())
	{
		p = q.front(); q.pop();
		cout << p->ch << ' ';
		if (p->lc != NULL) q.push(p->lc);
		if (p->rc != NULL) q.push(p->rc);
	}
	
	return;
}

二、二叉树深度

int Depth(BiTree& T)
{
	if (T == NULL) return 0;
	else
	{
		int m = Depth(T->lchild);
		int n = Depth(T->rchild);

		return (m > n) ? (m+1) : (n+1);
	}
}

三、统计二叉树结点

1. 统计所有结点数

int TreeNodeCnt(BiTree& T)
{
	if (T == NULL) return 0;
	else
	{
		return TreeNodeCnt(T->lchild) + TreeNodeCnt(T->rchild) + 1;
	}
}

2. 统计度为0的结点数

int TreeNodeCnt_0(BiTree& T)
{
	if (T == NULL) return 0;
	if (T->lchild == NULL && T->rchild == NULL) return 1;
	
	return TreeNodeCnt_0(T->lchild) + TreeNodeCnt_0(T->rchild);
}

3. 统计度为1的结点数

int TreeNodeCnt_1(BiTree &T)
{
	if (T == NULL) return 0;
	if (T->lchild == NULL && T->rchild != NULL) 
	{
		return TreeNodeCnt_1(T->rc) + 1;
	}
    if (T->lchild != NULL && T->rchild == NULL) 
	{
		return TreeNodeCnt_1(T->lc) + 1;
	}
	return TreeNodeCnt_1(T->lc) + TreeNodeCnt_1(T->rc);
}

四、复制二叉树

void CopyBiTree(BiTree& T, BiTree& NewT)
{
	if (T == NULL) NewT = NULL;
	else 
    {
		NewT = new TreeNode;
		NewT->ch = T->ch;

		CopyBiTree(T->lchild, NewT->lchild);
		CopyBiTree(T->rchild, NewT->rchild);
	}

	return;
}

五、删除二叉树

void DestoryBiTree(BiTree& T)
{
	if (T == NULL) return;
	if (T->lchild == NULL && T->rchild == NULL)
	{
		delete T;
		return;
	}
	DestoryBiTree(T->lchild);
	DestoryBiTree(T->rchild);
}

错误示范

void DestoryBiTree(BiTree& T)
{
	if (T == NULL) return;
	TreeNode* tmp = T;
	delete T;//这里T与tmp是同一块地址
	DestoryBiTree(tmp->lchild);
	DestoryBiTree(->rchild);
}

THEEND…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值