二叉樹基本操作(下)

2021-08-14 21:18:51 字數 4377 閱讀 1573

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...