1. 求二叉樹的高度
2. 求二叉樹葉子結點的個數
3. 求二叉樹結點的個數
4. 求二叉樹第k層結點的個數
5. 判斷乙個節點是否在一棵二叉樹中
6. 獲取乙個節點的雙親結點
7. 獲取乙個節點的左孩子結點
8. 求二叉樹的映象(遞迴&非遞迴)
9.判斷一棵二叉樹是否為完全二叉樹(層序遍歷變形)
完整源**
1、binarytree.h
#ifndef __tree_h__
#define __tree_h__
#include
#include
#include
#include
typedef int btdatatype;
typedef struct btnode //樹結構
btnode;
btnode* createbtree(btdatatype *a,size_t *index,btdatatype invalid); //建立一棵二叉樹
size_t btreelenth(btnode* root); // 求二叉樹的高度
size_t btreeleafnumber(btnode* root); //求二叉樹葉子結點的個數
size_t btreenodenumber(btnode *root);// 求二叉樹結點的個數
size_t btreeklevelnodenumber(btnode* root, size_t k); //求二叉樹第k層結點的個數
btnode* btreenodefind(btnode* root, btdatatype x) ; //判斷乙個節點是否在一棵二叉樹中
btnode* getbtreeparents(btnode *root,btnode *node); //獲取乙個節點的雙親結點
btnode* getnodeleftchild(btnode *root,btnode *node);//獲取乙個節點的左孩子結點
btnode* btreemirrorr(btnode *root);// 求二叉樹的映象(遞迴&非遞迴)
btnode* btreemirror(btnode *root);// 求二叉樹的映象(非遞迴)
size_t checkbtree(btnode *root);// 判斷一棵二叉樹是否為完全二叉樹(層序遍歷變形)
size_t checkbtreef(btnode* root) ;// flag的方式判斷
#endif //__tree_h__
2、binarytree.c
size_t btreelenth(btnode* root) // 求二叉樹的高度
if (btreelenth(root->left)>=btreelenth(root->right)) //返回左右高度中高的乙個再加一
return btreelenth(root->left)+
1; else
return btreelenth(root->right)+1;}
size_t btreeleafnumber(btnode* root) //求二叉樹葉子結點的個數
if (null
== root->right) //當左邊為null時,如果右邊也為null,則為葉子節點
return
1; return btreeleafnumber(root->left)+btreeleafnumber(root->right); //左子樹葉子+右子樹葉子
}size_t btreenodenumber(btnode *root)// 求二叉樹結點的個數
return btreenodenumber(root->left) + btreenodenumber(root->right)+
1; //左子樹節點數 + 右子樹節點 + 1
}size_t btreeklevelnodenumber(btnode* root, size_t k) //求二叉樹第k層結點的個數
if (k==
1)
//二叉樹不為空,且左右子樹不同時為空,返回左子樹中葉子節點個數加上右子樹中葉子節點個數
return btreeklevelnodenumber(root->left,k-
1) + btreeklevelnodenumber(root->right,k-
1);}
btnode* btreenodefind(btnode* root, btdatatype x) //判斷乙個節點是否在一棵二叉樹中(層序遍歷比較)
if (front->left)
if (front->right)
}return
null; //沒找到
}btnode* getbtreeparents(btnode *root,btnode *node) //獲取乙個節點的雙親結點(層序遍歷)
queueinit(&q);
queuepush(&q,tmp);
while (queueempty(&q)) //取隊頭元素訪問,並同時入隊該元素的左右非空子樹節點
return
null; //沒有該節點
}btnode* getnodeleftchild(btnode *root,btnode *node)//獲取乙個節點的左孩子結點(層序遍歷)
}return
null; //沒有該節點
}static void swap(btnode **left,btnode **right) //交換
btnode* btreemirrorr(btnode *root)// 求二叉樹的映象(遞迴)
btreemirrorr(root->left);
btreemirrorr(root->right);
swap(&root->left,&root->right); //左右交換
return root;
}btnode* btreemirror(btnode *root)// 求二叉樹的映象(非遞迴)
top = stacktop(&s); //左子樹為空,取棧頂
swap(&top->left,&top->right);
stackpop(&s);
tmp = top->right; //右子樹
}return root;
}size_t checkbtree(btnode *root)// 判斷一棵二叉樹是否為完全二叉樹(層序遍歷變形)
while (queueempty(&q)) //如果從第乙個空元素後面沒有非空元素,則是完全二叉樹,否則,不是。
queuepop(&q);
}return1;}
size_t checkbtreef(btnode *root) // flag的方式判斷
top = stacktop(&s); //左子樹為空,取棧頂
stackpop(&s);
if (!top->left && top->right) //左子樹 = null,右子樹 != null.
tmp = top->right; //訪問右子樹
}if (flag ==
0) return
1; else
return
0;}
3、test.c
void test2()
; btdatatype index = 0;
btnode *tree = createbtree(a,&index,'#');
btreeprevorderr(tree); //前序遍歷
printf("%d \n",btreelenth(tree));
printf("%d \n",btreeleafnumber(tree));
printf("%d \n",btreenodenumber(tree));
printf("%d \n",btreeklevelnodenumber(tree,3));
printf("%p \n",btreenodefind(tree,2));
printf("%p \n",getbtreeparents(tree,btreenodefind(tree,4)));
printf("%p \n",getnodeleftchild(tree,btreenodefind(tree,1)));
tree = btreemirrorr(tree);
tree = btreemirror(tree);
printf("%d \n",checkbtree(tree));
printf("%d \n",checkbtreef(tree));
}
二叉樹基本操作
tree.h ifndef tree h define tree h include typedef int element 定義二叉樹 typedef struct nodetreenode void preorder treenode root 遞迴前序遍歷 void inorder treen...
二叉樹基本操作
一.二叉樹的定義 二.二叉樹的建立 定義一棵無資料的二叉樹 6 int left size 7 int right size 為了操作簡便,我們定義一棵不需要儲存資料的二叉樹,只要能儲存節點之間的邏輯關係就行,所以用兩個陣列來表示。left i 第i個節點的左子節點的序號 right i 第i個節點...
二叉樹基本操作
include include define maxsize 100 typedef char elemtype typedef struct node btnode void createbtnode btnode b,char str 由str串建立二叉鏈 j ch str j btnode f...