getChildCount()的结果

今天在阅读源代码时,遇到了getChildCount()的方法,一时不知道返回什么值,所以自己进行了验证,发现getChildCount()方法返回的是直接子元素的个数,不包含子元素内部包含的元素个数,具体描述如下:


(1)只有ViewGroup类(及其子类如常用的LinearLayout,RelativeLayout等)才有这个方法;一般的View(如Button,ImageView)是没有这个方法的,当然,这也非常正常

(2)getChildCount()方法仅返回其所包含的直接控件的数量。如 LinearLayout A下有一个Button和一个LinearLayout B,但是不论B中包含多少个组件,A.getChildCount()方法返回值都是2;

(3)如果(2)中的LinearLayout  A还通过include标签包含了另外一个布局文件C(LinearLayout),那么不论C中有几个组件,A.getChildCount() = 3

 ( 4 )  如果LinearLayout A 中又include了一个布局文件D, 且该布局文件 外部不是各种Layout,那么该布局文件只能放置一个View(如ImageView),所以此时A.getChildCount() =   4;

(5)如果LinearLayout A中又include了一个局部文件E,该布局文件的最外部元素是<merge>   .... </merge>,那么由于使用merge方式引入不会增加层级,即E中的元素与A中的子元素属于同一层级,所以,此时getChildCount增加的值取决于E中元素的个数,如果E中有3个子元素,那么此时 A.getChildCount() = 7;


 


#include <stdio.h> #include <stdlib.h> #define MAX_N 100 typedef struct TreeNode { char val; struct TreeNode *left; struct TreeNode *right; } TreeNode; int findIdx(char *arr, int start, int end, char val) { for (int i = start; i <= end; i++) { if (arr[i] == val) { return i; } } return -1; } TreeNode *buildTree(char *preorder, char *inorder, int start, int end) { static int preIdx = 0; if (start > end) { return NULL; } TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode)); node->val = preorder[preIdx++]; if (start == end) { node->left = NULL; node->right = NULL; return node; } int inIdx = findIdx(inorder, start, end, node->val); node->left = buildTree(preorder, inorder, start, inIdx - 1); node->right = buildTree(preorder, inorder, inIdx + 1, end); return node; } int getNodeCount(TreeNode *root) { if (root == NULL) { return 0; } return getNodeCount(root->left) + getNodeCount(root->right) + 1; } void printLevelOrder(TreeNode *root) { if (root == NULL) { return; } TreeNode *queue[MAX_N]; int front = 0, rear = 0; queue[rear++] = root; while (front < rear) { int levelSize = rear - front; for (int i = 0; i < levelSize; i++) { TreeNode *node = queue[front++]; printf("%c ", node->val); if (node->left) { queue[rear++] = node->left; } if (node->right) { queue[rear++] = node->right; } } printf("\n"); } } int getChildCount(TreeNode *node) { if (!node || (!node->left && !node->right)) { return 0; } int count = 0; if (node->left) { count++; } if (node->right) { count++; } return count; } int main() { char preorder[MAX_N], inorder[MAX_N], target; int n, len; printf("请输入二叉树长度、先序序列、中序序列:\n"); scanf("%d%s%s", &n, preorder, inorder); len = strlen(preorder); TreeNode *root = buildTree(preorder, inorder, 0, len - 1); printf("层序遍历:\n"); printLevelOrder(root); printf("节点个数为:%d\n", getNodeCount(root)); printf("请输入要查询子节点的节点:\n"); scanf(" %c", &target); TreeNode *node = root; while (node && node->val != target) { if (node->val > target) { node = node->left; } else { node = node->right; } } if (!node) { printf("未找到该节点!\n"); } else { printf("子节点个数为:%d\n", getChildCount(node)); } return 0; }
06-09
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值