二叉树的初始化
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);
}