算法思想
① 如果当前结点不为空。执行②。
② 如果当前结点只有只有左子树,没有右子树,输出结点值,设置的全局变量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;
}