基于二叉链表的二叉树结点个数的统计

#include<bits/stdc++.h>
using namespace std;
typedef struct node
{
    char data;
    struct node *lc,*rc;
} node,*link;
int i,flag,a,b,c;
void creat(link &L)
{
    char ch;
    scanf("%c",&ch);
    i++;
    if(i==1&&ch=='0')
    {
        flag=0;
        return ;
    }
    if(ch=='0')
        L=NULL;
    else
    {
        L=new node;
        L->data=ch;
        creat(L->lc);
        creat(L->rc);
    }
}
int js(link L)
{
    if(!L) return 0;
    else
    {
        if(!L->lc&&!L->rc) a++;
        else if(L->lc&&L->rc) b++;
        return js(L->lc)+js(L->rc)+1;
    }
}
int main()
{
    while(1)
    {
        i=0,flag=1,a=0,b=0,c=0;
        link L;
        creat(L);
        if(!flag) break;
        c=js(L);
        printf("%d %d %d\n",a,c-b-a,b);
        getchar();
    }
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 二叉链表是一种二叉树的存储结构,每个节点包含指向左右子节点的指针。要求解从叶子节点到根节点的路径,可以采用递归的方式,从叶子节点开始向上遍历,每次将当前节点的值添加到路径中,直到遍历到根节点为止。具体实现可以参考以下伪代码: function findPath(root, leaf, path): if root is None: return False if root == leaf: path.append(root.value) return True if findPath(root.left, leaf, path) or findPath(root.right, leaf, path): path.append(root.value) return True return False 其中,root表示当前节点,leaf表示目标叶子节点,path表示当前路径。如果当前节点为空,返回False;如果当前节点为目标叶子节点,将其值添加到路径中并返回True;否则递归遍历左右子树,如果找到目标叶子节点,则将当前节点的值添加到路径中并返回True,否则返回False。最终,如果找到了路径,path中存储的就是从叶子节点到根节点的路径。 ### 回答2: 二叉链表是一种常用的二叉树存储结构,它是由二叉树结点的左、右孩子指针和指向父结点的指针组成的。在基于二叉链表二叉树中,叶子结点到根结点的路径可以通过遍历二叉树实现。常用的二叉树遍历方式有前序遍历、中序遍历和后序遍历。 前序遍历是指先访问根结点,然后按照左子树、右子树的顺序进行遍历。在基于二叉链表二叉树中,前序遍历的实现可以采用递归和迭代两种方式。递归实现方式比较简单,可以先访问当前结点,然后递归遍历左子树和右子树。迭代实现方式需要借助栈数据结构,先将根结点入栈,然后循环中出栈,访问当前结点,再将右孩子和左孩子入栈。 中序遍历是指按照左子树、根结点、右子树的顺序进行遍历。在基于二叉链表二叉树中,中序遍历的实现也可以采用递归和迭代两种方式。递归实现方式先递归遍历左子树,然后访问当前结点,最后递归遍历右子树。迭代实现方式需要借助栈数据结构和指针,先将根结点的指针入栈,然后循环中如果当前指针不为空,则将当前指针的左孩子指针入栈并将当前指针指向左孩子,直到当前指针为空,则出栈一个节点,访问当前节点并将当前指针指向右孩子。 后序遍历是指按照左子树、右子树、根结点的顺序进行遍历。在基于二叉链表二叉树中,后序遍历的实现也可以采用递归和迭代两种方式。递归实现方式先递归遍历左子树,再递归遍历右子树,最后访问当前结点。迭代实现方式需要借助栈数据结构和指针,先将根结点的指针入栈,并标记当前节点是否已被访问。循环中如果当前节点未被访问且当前节点的左右孩子节点都为空,则访问当前节点,并将标记当前节点为已访问。如果当前节点的左右孩子节点不为空,则按照右孩子、左孩子的顺序入栈。 通过以上三种遍历方式,可以实现基于二叉链表二叉树叶子结点到根结点的路径的求解。具体实现根据需要选择不同的遍历方式即可。 ### 回答3: 首先,我们需要了解什么是二叉链表二叉链表是一种链式存储结构,它由数据和两个指针构成,一个指向左子树,一个指向右子树。在遍历二叉树的时候,我们可以通过这两个指针找到每个结点的子树。 基于二叉链表二叉树叶子结点到根结点的路径的求解,可以使用递归实现。首先,我们需要判断当前结点是否为空,如果为空,返回空路径。如果当前结点是叶子结点,返回该结点本身。如果当前结点不是叶子结点,我们需要在左子树和右子树中分别寻找目标结点,如果左子树和右子树中都能找到目标结点,说明目标结点在当前结点的左右子树中都有,我们选择左子树作为路径并将当前结点加入路径中。如果只在左子树中找到了目标结点,将目标结点加入路径中,同时向左子树递归。如果只在右子树中找到了目标结点,将目标结点加入路径中,同时向右子树递归。通过递归,直到找到目标结点,或者返回空路径。 具体步骤如下: 1. 如果当前结点是空结点,返回空路径。 2. 如果当前结点是叶子结点,返回该结点本身。 3. 向左子树递归查找目标结点,如果能找到,将目标结点加入路径中并返回路径。 4. 向右子树递归查找目标结点,如果能找到,将目标结点加入路径中并返回路径。 5. 如果在左子树和右子树中都能找到目标结点,将左子树作为路径并将当前结点加入路径中,并返回路径。 通过以上步骤,我们可以得到从叶子结点到根结点的路径。当然,在实际应用中也需要根据实际情况进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值