C++簡單又輕松建立鏈式二叉樹流程
遞歸建立二叉樹
二叉樹的結構體
typedef struct Node { int data; Node* lchild; Node* rchild; }BiNode,*BiTree;
二叉樹顧名思義最多只有兩個子結點和一個數(shù)據(jù)域,既然是鏈式那么子結點定義為結點指針類型,數(shù)據(jù)域就可以根據(jù)需要設置了,可以是整型也可以是字符型。
二叉樹初始化
BiTree createBiTree(BiTree &T) { int d; cin >> d; if (d == 0) T = NULL; else { T = (BiTree)malloc(sizeof(BiNode)); T->data = d; T->lchild = createBiTree(T->lchild); T->rchild = createBiTree(T->rchild); } return T; }
這個初始化函數(shù)的返回值為BiTree是一個結構體指針類型,用來返回初始化后的 T 二叉樹;整型數(shù)據(jù)d是用來給二叉樹的結點賦值的,當輸入0的時候,該結點為空結點;當結點的數(shù)據(jù)域不為零,給該結點動態(tài)分配內存空間,并把d賦值給T->data;然后就是對左右子樹的遞歸初始化了。
先序遍歷
void PreOrder(BiTree T)//先序 { if (T) { cout << T->data<<" "; PreOrder(T->lchild); PreOrder(T->rchild); } }
先序遍歷就是先訪問根結點,在訪問左子樹,最后訪問右子樹,這里也寫成遞歸形式;先訪問當前結點的數(shù)據(jù),再對左右子樹進行訪問。
中序遍歷
void InOrder(BiTree T)//中序 { if (T != NULL) { PreOrder(T->lchild); cout << T->data << " "; PreOrder(T->rchild); } }
中序遍歷就是先訪問左子樹,在訪問根結點,最后訪問右子樹,這里也寫成遞歸形式;先訪問當前結點的左子樹的數(shù)據(jù),再對該結點的數(shù)據(jù)進行訪問,最后對右子樹進行訪問。
后序遍歷
void PostOrder(BiTree T)//后序 { if (T) { PreOrder(T->lchild); PreOrder(T->rchild); cout << T->data << " "; } }
后序遍歷就是先訪問左子樹,在訪問右子樹,最后訪問根結點,這里也寫成遞歸形式;先訪問當前結點的左子樹的數(shù)據(jù),再對右子樹進行訪問,最后訪問根結點。
具體例題
參考上面的結構體,設計一個函數(shù),要求能夠同時求出二叉樹中所有結點的的個數(shù)和二叉樹中數(shù)據(jù)為奇數(shù)的和;
我的思考:該函數(shù)傳入m和n兩個全局變量,使用引用傳遞;當樹不為空時,m++,n等于n加該結點數(shù)據(jù)域的值,接下來進行左右子樹的遞歸調用:
void countT(BiTree T, int &m, int &n) { if (T == NULL) return ; if (T->data % 2 != 0) n += T->data; m++; countT(T->lchild, m, n); countT(T->rchild, m, n); }
從主函數(shù)中這樣調用:
int m = 0,n = 0;
BiTree T=NULL;
countT(T, m, n);
最后輸出m和n的值即可
效果截圖:
注意輸出的格式,必須是樹的形式,下面解析一下
輸入的格式
注意:輸入的格式必須是樹的先序遍歷形式,因為在這個程序中初始化二叉樹就是用的先序的方式
在這個二叉樹先序輸入數(shù)據(jù):3 4 6 0 8 0 0 0 11 13 0 0 0
全部源碼
粘貼到C++編譯器就能使用
#include<iostream> using namespace std; typedef struct Node { int data; Node* lchild; Node* rchild; }BiNode,*BiTree; BiTree createBiTree(BiTree &T) { int d; cin >> d; if (d == 0) T = NULL; else { T = (BiTree)malloc(sizeof(BiNode)); T->data = d; T->lchild = createBiTree(T->lchild); T->rchild = createBiTree(T->rchild); } return T; } void PreOrder(BiTree T)//先序 { if (T) { cout << T->data<<" "; PreOrder(T->lchild); PreOrder(T->rchild); } } void InOrder(BiTree T)//中序 { if (T) { InOrder(T->lchild); cout << T->data << " "; InOrder(T->rchild); } } void PostOrder(BiTree T)//后序 { if (T) { PostOrder(T->lchild); PostOrder(T->rchild); cout << T->data << " "; } } void countT(BiTree T, int &m, int &n) { if (T == NULL) return ; if (T->data % 2 != 0) n += T->data; m++; countT(T->lchild, m, n); countT(T->rchild, m, n); } int main() { int m = 0,n = 0; BiTree T=NULL; cout << "輸入先序遍歷結點,建立二叉樹" << endl; T = createBiTree(T); cout << "先序遍歷結果" << endl; PreOrder(T); cout << endl; cout << "中序遍歷結果" << endl; InOrder(T); cout << endl; cout << "后序遍歷結果" << endl; PostOrder(T); cout << endl; countT(T, m, n); cout << "結點個數(shù)為:" << m << endl; cout << "數(shù)據(jù)為:" << n << endl; }
總結
代碼不是很長,每一個功能都對應一個函數(shù),希望大家可以迅速掌握二叉鏈的基本使用,加油!
如果覺得寫得好,記得點贊支持一下哦
到此這篇關于C++簡單又輕松建立鏈式二叉樹流程的文章就介紹到這了,更多相關C++鏈式二叉樹內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++ 動態(tài)創(chuàng)建按鈕及 按鈕的消息響應
這篇文章主要介紹了C++ 動態(tài)創(chuàng)建按鈕及 按鈕的消息響應的相關資料,需要的朋友可以參考下2015-06-06