只有左孩子没有右孩子的结点

算法思想

① 如果当前结点不为空。执行②。

如果当前结点只有只有左子树,没有右子树,输出结点值,设置的全局变量num++。

 左孩子递归。

 右孩子递归。

很明显就是一个二叉树的遍历,只是加了一个计数而已。加粗部分放在左右孩子递归前,是前序遍历,放在中间,中序遍历,放在最后,后序遍历。

代码实现


int num =0;
void onlyLeft(TreeNode* node)
{
    if(node!=NULL)
    {
        if(node->lChild != NULL && node->rChild == NULL)
        {
            printf("\n%d结点只有左孩子  ",node->key);
            num++;
        }
        onlyLeft(node->lChild);
        onlyLeft(node->rChild);
    }
}

完整代码

ps:为了简单,建树的操作直接用了上一题的二叉排序树的代码,不影响。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

typedef struct TreeNode
    {
        int key;
        struct TreeNode* lChild;
        struct TreeNode* rChild;
    }TreeNode;

void inDFS(TreeNode *node)
{
    if(node != NULL) {
        inDFS(node->lChild);
        printf("%d   ",node->key);
        inDFS(node->rChild);
    }
}

//写一个函数专门插入子孩子,采用递归,从根节点开始寻找合适的插入点
void BSTInsert(TreeNode *&node, int key)
{
	if (NULL == node)  //为空的位置即为插入位置
	{
    node = (TreeNode*)malloc(sizeof(TreeNode));  //申请并插入新结点
	node->lChild = NULL;
	node->rChild = NULL;
	node->key = key;
	}
	else{
        if (key < node->key)  //与左孩子比较
			BSTInsert(node->lChild,key);
		else if (key > node->key)  //查看右孩子
			BSTInsert(node->rChild,key);
        else
		printf("\nThe node(%d) already exists.\n", key);
}
}
// 结点个数:6
// 结点值:  9 8 18 7 16 17
void CreateBST(TreeNode *&node)
{
	int n,i=0,key;
	printf("请输入二叉树结点个数  ");
	scanf("%d",&n);    //二叉树结点个数
	printf("请输入二叉树结点值序列  ");
	for(i=0;i<n;i++)
    {
        scanf("%d",&key);      //输入结点值
        BSTInsert(node,key);
    }

}

TreeNode* ParentPath(TreeNode* node,int x)
    {
        if(node == NULL || x == node->key)//如果特定值等于当前节点值或当前节点值为空,无双亲。
            return NULL;
        else{
            printf("%d   ",node->key);
            if((node->lChild ==NULL || x != node->lChild->key)
                && (node->rChild ==NULL || x != node->rChild->key))
            {
               if (x < node->key)  //与左孩子比较
			     ParentPath(node->lChild,x);
               else if (x > node->key)  //查看右孩子
			     ParentPath(node->rChild,x);
            }
            else if((node->lChild !=NULL && x == node->lChild->key)
                    || (node->rChild !=NULL && x == node->rChild->key))
                   return node;
        }
    }

int num =0;
void onlyLeft(TreeNode* node)
{
    if(node!=NULL)
    {
        if(node->lChild != NULL && node->rChild == NULL)
        {
            printf("\n%d结点只有左孩子  ",node->key);
            num++;
        }
        onlyLeft(node->lChild);
        onlyLeft(node->rChild);
    }
}


int main()
{
    TreeNode * root= NULL;
    TreeNode * p= NULL;
    CreateBST(root);
    printf("\n中序遍历二叉排序树结构  ");
    inDFS(root);
//    int x=0;
//    printf("\n输入特定值  ");
//    scanf("%d",&x);
//    printf("\n%d的双亲结点路径  ",x);
//    p=ParentPath(root,x);
//    if(p == NULL) printf("\n找不到%d的双亲结点\n",x);
//    else printf("\n%d的双亲为   %d",x,p->key);
    onlyLeft(root);
     printf("\n只有左孩子没有右孩子结点个数为  %d",num);
    return 0;
}

运行实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值