查找二叉树节点
求二叉树的深度
交换二叉树的左右子树
求二叉树的最大宽度
求度为2的节点的个数:双分枝节点个数
求度为1和2的节点的个数
度为1的节点的个数
统计所有的节点的个数
找出节点中最小的值
所有节点之和
查找值为x的节点的个数
释放所有的节点
以上方法均采用递归完成
一.递归查找二叉树节点
写法一.
Node *find(Node *node,char ch) { if(node==NULL) return NULL; else if(node->data==ch) return node; else { Node *p=find(node->left,ch); if(p) return p; else return find(node->right, ch); } }
写法二.
Node *find_node(Node *node,int ch) { if(node) { if(node->data==ch) return node; else { Node *p=find_node(node->left, ch); if(p) return p; else return find_node(node->right, ch); } } else return NULL; }
二.求二叉树的深度
int depth(Node *node) { if(node==NULL) return 0; else { int ld=depth(node->left); int rd=depth(node->right); return (ld>rd?ld:rd)+1; } }
三.交换二叉树的左右子树
后序交换法
void reverse(Node *node) { if(node) { reverse(node->left); reverse(node->right); Node *temp=node->left; node->left=node->right; node->right=temp; } }
先序交换法
void reverse_tree(Node *node) { if(node==NULL) return; Node *temp=node->left; node->left=node->right; node->right=temp; if(node->left) reverse_tree(node->left); if(node->right) reverse_tree(node->right); }
四.求二叉树的最大宽度
int count[MAXSIZE]; int max=-1; void width(Node *node,int level) { if(node==NULL) return; count[level]++;//level表示当前层数,++表示存在节点,则计数器多加一个 if(max<count[level])//最大节点计数器 max=count[level]; width(node->left, level+1);//进入下一层递归,进入下一个递归时,层数+1 width(node->right, level+1); }
五.求度为2的节点的个数:双分枝节点个数
int degree(Node *node) { if(node==NULL) return 0; if(node->left&&node->right) return 1+degree(node->left)+degree(node->right); return degree(node->left)+degree(node->right); }
六.求度为1和2的节点的个数
int degree(Node *node) { if(node==NULL) return 0; if(node->left||node->right)//条件改为|| return 1+degree(node->left)+degree(node->right); return degree(node->left)+degree(node->right); }
七.度为1的节点的个数
int degree(Node *node) { if(node==NULL) return 0; if((node->left&&node->right==NULL)||(node->left==NULL&&node->right))//条件改为|| return 1+degree(node->left)+degree(node->right); return degree(node->left)+degree(node->right); }
八.统计所有的节点的个数
int count_node(Node *node) { if(node==NULL) return 0; else { int num_left=count_node(node->left); int num_right=count_node(node->right); return num_left+num_right+1; } }
九.找出节点中最小的值
void min_node(Node *node,int *min) { if(node) { if(*min>node->data) *min=node->data; min_node(node->left,min); min_node(node->right,min); } } void find_min(Tree *tree) { int min=tree->root->data; min_node(tree->root, &min); printf("%d ",min); }
十.所有节点之和
int sum_all_node(Node *node) { if(node==NULL) return 0; else return node->data+sum_all_node(node->left)+sum_all_node(node->right); }
十一.查找值为x的节点的个数
int find_criteria(Node *node,int worth) { if(node==NULL) return 0; else if(node->data==worth) return 1+find_criteria(node->left, worth)+find_criteria(node->right, worth); else return find_criteria(node->left, worth)+find_criteria(node->right, worth); }
十二.释放所有的节点
void free_all_node(Node *node) { if(node) { free_all_node(node->left); free_all_node(node->right); free(node); } }