求二叉树结点个数和深度
typedef struct Node{ struct Node *lchild; char data; struct Node *rchild; }BTNode;
//求二叉树中的节点个数 (1)如果二叉树为空,节点个数为0 (2)如果二叉树不为空,二叉树节点个数 = 左子树节点个数 + 右子树节点个数 + 1 int getNodeNum(BTNode* root) { if(root == NULL) { return 0; }else{ return getNodeNum(root->lchild) + getNodeNum(root->rchild) + 1; } }
//求二叉树中叶子节点的个数 (1)如果二叉树为空,返回0 (2)如果二叉树不为空且左右子树为空,返回1 (3)如果二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数加上右子树中叶子节点个数 int getLeafNodeNum(BTNode* root) { if(root == NULL) return 0; if(root->lchild == NULL && root->rchild == NULL) return 1; int leftNum = getLeafNodeNum(root->lchild); //左子树中叶节点的个数 int rightNum = getLeafNodeNum(root->rchild); //右子树中叶节点的个数 return (leftNum +rightNum); }
//求二叉树第k层的节点个数 (1)如果二叉树为空或者k<1返回0 (2)如果二叉树不为空并且k==1,返回1 (3)如果二叉树不为空且k>1,返回左子树中k-1层的节点个数与右子树k-1层节点个数之和 int getNodeNumKthLevel(BTNode* root, int k) { if(root==NULL || k<1) return 0; if(k == 1) return 1; int leftNum = getNodeNumKthLevel(root->lchild, k-1); //左子树中k-1层的节点个数 int rightNum = getNodeNumKthLevel(root->rchild, k-1); //右子树中k-1层的节点个数 return (leftNum + rightNum); }
//求二叉树的深度
(1)如果二叉树为空,二叉树的深度为0
(2)如果二叉树不为空,二叉树的深度 = max(左子树深度, 右子树深度) + 1
int depth(BTNode* root) { if(root==NULL){//头指针为空 return 0; } else { int m = depth(root->lchild ); int n = depth(root->rchild); return (m>n)?(m+1):(n+1);//1是加上顶点的深度 } }
二叉树的最小深度:从根节点到最近叶子节点的最短路径上的节点数量。。 int minDepth(BTNode *root) { if(root == NULL){ return 0; } if(root->lchild == NULL&&root->rchild == NULL){ return 1; } //若左子树为空,则返回右子树的深度,反之返回左子树的深度 if(root->lchild == NULL){ return minDepth(root->rchild) + 1; }else if(root->rchild == NULL){ return minDepth(root->lchild) + 1; }else{ //如果都不为空,则返回左子树和右子树深度的最小值 int leftDepth = minDepth(root->lchild) + 1; int rightDepth = minDepth(root->rchild) + 1; return leftDepth<rightDepth ? leftDepth:rightDepth; } }