入门二叉树,三种遍历,计算结点个数 ,深度 叶子结点个数,第k层结点个数

1.关于二叉树的前中后序快速排序

在这里插入图片描述那就在这里拿这张图来演示一下怎样快速写出中序遍历,我们都知道中序遍历是,左子树,根,右子树

  1.                B                            A                      C
    
  2.   D                       E                                                      F
    
  3.                                     H   
    
  4. 最后直接得出结果DBEHACF

2.二叉树的五种基本结构
拿代码表示:

typedef struct Node{
  int value;
  struct Node *left;              //既是左孩子,又同时代表着整颗左树
  struct Node *right;             //既是右孩子,又代表整颗右树
}

void PreorderTraversal(Node *root) {  //定义一个函数,将一个树的根传进去
  if (root==NULL){
  return ;                    //如果传进去的树为空树,那么直接返回
}
   printf ("%d",root->value);      //否则打印根
  PreorderTraversal(root->left)           //打印完根然后只有左或者右不为空才会继续进行这两步,将左右子树作为根传进去
  PreorderTraversal(root->right)
}

关于递归函数,当函数执行完之后要是还被嵌套于其他函数中,则当前函数执行完毕,返回上一层函数继续执行,没有执行完的部分

//二叉树的前序遍历
int *p;
int size;
void _preorder(struct TreeNode *root){
if (root==NULL)
return ; //根
p[size++]=root->val;
_preorder(root->left); //左子树
_preorder(root->right); //右子树
}

int *preorderTraversal(struct TreeNode *root,int *returnSize){
p=(int *)malloc(sizeof(int)*100*10000); //开辟一块空间
size=0;
_preorder (root);
*returnSize=size;
return p;
}

其实上面这段代码写的其实有一点繁琐,上面这段代码是靠返回值来打印整个树的,其实我们不必这样来打印一颗树,看下面这段代码,比较简单易懂。

void preorder(struct *root){
if (root==NULL)
return ;
printf ("%d",root ->value); //根
preorder (root->left); //左子树
preorder(root->right); //右子树
}

中序遍历其实和前序遍历都一样,只需要改变一点就可以了,前序遍历在我们创建的函数里面先是根再是左子树,再是根,接着才是右子树,所以我们在了解到,前序和中序的区别之后,我们就了解到,只需要把,前序遍历的顺改变就可以了,顺序为,左子树,根,右子树


void preorder(struct *root){
if (root==NULL)
return ;
preorder (root->left); //左子树
printf ("%d",root ->value); //根 
preorder(root->right); //右子树
}

计算一棵树的结点个数,有两个思路,一个就是遍历,遍历的时候不为空,则结点个数加一,另外一个就是通过递归返回值来计算节点个数。

这里本人英文不是很好,函数名就拿拼音代替了


int size=0;
void jisuanjiediangeshu(struct *root){
if (root==NULL)
return ;
size++ //结点不为空则自增一
jisuanjiediangeshu(root->left); //左子树
jisuanjiediangeshu(root->right);//右子树
}

递推方式

int size(Node *root){
if (root ==NULL)
return 0;
size(root->left);
size(root->right);
return left+right+1;
} 

利用递推公式来求叶子结点个数

int LeafSize(Node *root){
if(root==NULL)
return 0;
if (root->left==NULL&&root->right==NULL){
return 1;
}
LeafSize(root->left);
LeafSize(rroot->right);
return left+right;
}

求二叉树高度

int GetHeight (Node *root)
{
if (root==NULL)
return 0;	
int left=GetHeight(root->left);
int right=GetRight(root->right);
return (left>right?left:right)+1;      
}

关于二叉树这一块的递归都是,代码好写,也比较好理解,要仔细去体会每一个返回值,刚开始看的时候可能会有一点蒙蔽,边画图边理解,是一个不错的主意。
求第k层结点个数

int GetKLevelSize(Node *root,int k){
if (root==NULL)
return 0;
if (k===1)
return 1;
return  GetKLevelSize(root->left, k-1)+GetKLevelSize(root->right, k-1);
}//这个比较难理解,下去要慢慢理解

//二叉树结点中所有value都不重复
//找结点的value是v的结点
//如果找到了,返回v所在的地址
//如果没找到,返回NULL
//find返回NULL意味着没找到,返回非NULL,意味着找到了
//先确定根结点->左子树中是否包含-右子树中是否包含
//如果根结点就是,那么就不需要去左右子树查找
//如果 左子树找到就不需要去右子树找了

Node *Find(Node *root,int v){
if (root==NULL)
  return 0;
if (root->value==v)
  return root;
Node *result=Find(root->left,v);
  if (result!=NULL)
   return result;
Node *result=Find(root->right);
  if(result!=NULL)
   return result;
else{
   return NULL;
  }
}

猜你喜欢

转载自blog.csdn.net/weixin_43767691/article/details/89070529