二叉树基础算法

以下算法中二叉树的节点的数据结构为 

typedef struct BiTNode
{
	int data;
	struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;

1.求二叉树的叶子节点个数

void countLeaf(BiTNode* root,int* sum)
{
	if (root != NULL)
	{
		if (root->lchild == NULL && root->rchild == NULL)
		{
			(*sum)++;
		}
		if (root->lchild)
		{
			countLeaf(root->lchild,sum);
		}
		if (root->rchild)
		{
			countLeaf(root->rchild,sum);
		}
	}
}

2.求二叉树的高度

int countDepth(BiTNode* root)
{
	int left = 0, right = 0;
	if (root == NULL)
	{
		return 0;
	}
	else
	{	
		if (root->lchild)
		{
			left = countDepth(root->lchild);
		}
		if (root->rchild)
		{
			right = countDepth(root->rchild);
		}
	}
	return (left > right?++left:++right);
}

3.copy二叉树

BiTNode* copyTree(BiTNode* root)
{
	BiTNode* copyNode = NULL;//拷贝的节点
	BiTNode* newLp = NULL;//拷贝节点的左子树
	BiTNode* newRp = NULL;//拷贝节点的右子树
	if (root == NULL)
	{
		return NULL;
	}
	//拷贝左子树
	if (root->lchild != NULL)
	{
		newLp = copyTree(root->lchild);
	}
	else
	{
		newLp = NULL;
	}

	//copy右子树
	if (root->rchild != NULL)
	{
		newRp = copyTree(root->rchild);
	}
	else
	{
		newRp = NULL;
	}
	//开辟copy节点的内存空间
	copyNode = (BiTNode*)malloc(sizeof(BiTNode));
	if (copyNode == NULL)
	{
		return NULL;
	}
	copyNode->lchild = newLp;
	copyNode->rchild = newRp;
	copyNode->data = root->data; 
	return copyNode;
}

4.二叉树的非递归中序遍历

//找中序遍历的节点,并进行压栈操作
BiTNode* findLeftNode(BiTNode* root, stack<BiTNode*> &stack)
{
	if (root == NULL)
	{
		return NULL;
	}
	while (root->lchild != NULL)
	{
		stack.push(root);
		
		root = root->lchild;//指向左孩子
	}
	return root;
}
void NonRecMidTra(BiTNode* root)
{
	if (root == NULL)
	{
		return;
	}
	stack<BiTNode*> stack;
	BiTNode* node = NULL;
	node = findLeftNode(root,stack);//找到中序遍历的起始节点
	while (node)
	{
	
		printf("%d\t", node->data);
		if (node->rchild != NULL)
		{
			node = findLeftNode(node->rchild, stack);
		}
		else if (stack.size() > 0)
		{
			
			node =stack.top();
			stack.pop();
		}
		else
		{
			node = NULL;
		}
	}
	
}

5.二叉树的#号生成算法

        对于一个普通的二叉树,如下图(a)所示。对其叶子节点都补充#,补充完的效果如下图(b)所示。对(b)进行的前序遍历得到:AB#D##C##。通过这个先序遍历序列便可以生成(a)所示得树。 

                                                                 ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

                         

BiTNode* createMyTree()
{
	BiTNode* newNode = NULL;
	char tempChar = ' ';
	scanf("%c", &tempChar);
	if (tempChar == '#')
	{
		return NULL;
	}
	else//字符不为#则为树得结点
	{
		//开辟结点空间
		newNode = (BiTNode*)malloc(sizeof(BiTNode));
		if (newNode == NULL)
		{
			return NULL;
		}
		newNode->data = tempChar;//给节点的数据域赋值
		newNode->lchild = createMyTree();//添加节点的左孩子节点
		newNode->rchild = createMyTree();//添加节点的右孩子节点
	}
	return newNode;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值