二叉树

二叉树的初始化

void TreeInit(TreeNode** root){
  if(root == NULL){
   // printf("# ");
    return;
  }
  *root = NULL;
}


创建一个节点

void TreeInit(TreeNode** root){
  if(root == NULL){
   // printf("# ");
    return;
  }
  *root = NULL;
}

二叉树先序、中序、后序遍历都采用递归的方式

void PreOrder(TreeNode* root){
  if(root == NULL){
    return;
  }
  printf("%c ",root->data);
  PreOrder(root->lchild);
  PreOrder(root->rchild);
}


void InOrder(TreeNode* root){
  if(root == NULL){
    return;
  }
  InOrder(root->lchild);
  printf("%c ",root->data);
  InOrder(root->rchild);
}


void PostOrder(TreeNode* root){
  if(root == NULL){
   return;
  }
  PostOrder(root->lchild);
  PostOrder(root->rchild);
  printf("%c ",root->data);
}

层序思路:

1.先把根节点插入队列。

2.循环的取队首元素

3.访问队首元素并出对队列

4.将队首元素的左子树和右子树节点都依次入队列。

5.进入下一次循环,直到队列为空,说明遍历完了。

void LevelOrder(TreeNode* root){
  if(root == NULL){
    return;
  }
  SeqQueue q;
  SeqQueueInit(&q);
  //1.
  SeqQueuePush(&q,root);
  //2.
  TreeNode* cur = NULL;
  while(SeqQueueFront(&q,&cur)){
  //3.
    printf("%c ",cur->data);
    SeqQueuePop(&q);
  //4.
    if(cur->lchild != NULL){
       SeqQueuePush(&q,cur->lchild);
    }
    if(cur->rchild != NULL){
       SeqQueuePush(&q,cur->rchild);
    }

  //5.
  }
}

由已知的先序(包含空节点,空节点用#来表示)创建出一个二叉树

TreeNode* _TreeCreate(TreeNodeType array[],size_t size,size_t* index,TreeNodeType null_node){
  if(index == NULL){
    return NULL;
  }
  if(*index >= size){
    return NULL;
  }
  if(array[*index] == null_node){
    return NULL;
  }
  TreeNode* new_node = CreateTreeNode(array[*index]);
  ++(*index);
  new_node->lchild = _TreeCreate(array, size, index, null_node);
  ++(*index);
  new_node->rchild = _TreeCreate(array, size, index, null_node);
  return new_node;
}

TreeNode* TreeCreate(TreeNodeType array[],size_t size,TreeNodeType null_node){
   size_t index = 0;
   return _TreeCreate(array, size, &index, null_node );

}

求节点的个数

size_t TreeLeafSize(TreeNode* root){
  if(root == NULL){
   return 0;
  }
  return 1+TreeLeafSize(root->lchild)+TreeLeafSize(root->rchild);}

求第K层的节点个数

size_t TreeKLevelSize(TreeNode* root, int k){
  if(root == NULL){
     return 0;
  }
  if(k == 1){
     return 1;
  }
  return TreeKLevelSize(root->lchild, k - 1) + TreeKLevelSize(root->rchild,k - 1);
}

求一个树的高度

size_t TreeKLevelSize(TreeNode* root, int k){
  if(root == NULL){
     return 0;
  }
  if(k == 1){
     return 1;
  }
  return TreeKLevelSize(root->lchild, k - 1) + TreeKLevelSize(root->rchild,k - 1);
}

求某节点的左右孩子

TreeNode* LChild(TreeNode* node){
  if(node == NULL){
    return NULL;
  }
  return node->lchild;
}

TreeNode* RChild(TreeNode* node){
  if(node == NULL){
    return NULL;
  }
  return node->rchild;
}

求某节点的父节点

TreeNode* Parent(TreeNode* root, TreeNode* node){
  if(root == NULL || node == NULL){
    return NULL;
  }
  if(root->lchild == node || root->rchild == node){
    return root;
  }
  TreeNode* islchild = Parent(root->lchild,node);
  TreeNode* isrchild = Parent(root->rchild,node);
  return islchild != NULL ? islchild :isrchild;
}

生成一个二叉树的镜面像

void TreeMirror(TreeNode* root){
  if(root == NULL){
   return;
  }
  swap(&root->lchild,&root->rchild);
  TreeMirror(root->lchild);
  TreeMirror(root->rchild);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值