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

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

易错点:便利二叉树的时候不要忘记 if(t) 这个条件

#include<bits/stdc++.h>
using namespace std;
int node2,node1,node0;
typedef struct BiTnode{
	char data;
	struct BiTnode *left,*right;
}BiTnode,*BiTree;

void CreatTree(BiTree &t,char s[],int &i){
	if(s[i] == '0'){
		t = NULL;
	}else{
		t = new BiTnode;
		t->data = s[i];
		CreatTree(t->left,s,++i);
		CreatTree(t->right,s,++i);
	}
}

void NodeNum(BiTree &t){
	if(t){
		if(t->left != NULL && t->right != NULL){
			node2++;
		}else if(t->left != NULL && t->right == NULL){
			node1++;	
		}else if(t->left == NULL && t->right != NULL){
			node1++;
		}
		else if(t->left == NULL && t->right == NULL){
			node0++;
		}
		NodeNum(t->left);
		NodeNum(t->right);
	}
}


int main(){
	while(1){
		node0 = 0;
		node1 = 0;
		node2 = 0;
		char s[100];
		int i = 0;
		cin>>s;
		if(s[0] == '0'){
			break;
		}
		BiTree t;
		CreatTree(t,s,i);
		NodeNum(t);
		cout<<node0<<" "<<node1<<" "<<node2<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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. 如果在左子树和右子树中都能找到目标结点,将左子树作为路径并将当前结点加入路径中,并返回路径。 通过以上步骤,我们可以得到从叶子结点到根结点的路径。当然,在实际应用中也需要根据实际情况进行修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值