二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查詢樹和二叉堆。
二叉樹中有著一些非常重要的推論:
1. 度為2的結點比度為0的結點少1個;
2. 具有n個結點的完全二叉樹的深度k 為log2(n+1)個結點;
3. 若規定根結點的層數為1,則非空二叉樹第i層上最多有2^(i-1)個結點;
4. 若規定只有根結點的二叉樹深度為1,則深度為k的二叉樹最多有2^k-1個結點;
5. 若對於具有n個結點的完全二叉樹,從上至下,從左至右排序依次從0開始,那麼對於序號i:
(1)若i>0序號為i的結點的雙親結點序號為(i-1)/2;
(2)若2*i+1=n,則無左孩子;
(3)若2*i+1=n,則無右孩子;
二叉樹的結構:
templatestruct bintreenode
bintreenode* _pleft;
bintreenode* _pright;
t _data;
};
建立二叉樹:
void _createbintree(pnode& proot, const t* arr, size_t size, size_t& index, const t& invalid)
}
二叉樹的遍歷:
二叉樹由左子樹+根+右子樹構成,二叉樹的遍歷可以分為四種:前序,中序,後序層序遍歷四種。
前序遍歷:根+左子樹+右子樹,即:先訪問根,在訪問左子樹,在訪問右子樹;
中序遍歷:左子樹+根+右子樹,即:先訪問左子樹,在訪問根,在訪問右子樹;
後序遍歷:左子樹+右子樹+根,即:先訪問左子樹,在訪問右子樹,在訪問根;
層序遍歷:按層的順序,一層一層的遍歷。
void _preorder(pnode proot)//前序
}void _inorder(pnode proot)//中序
}void _postorder(pnode proot)//後序
}void _levelorder(pnode proot)//層序:層序的實現較為複雜,需要借助到佇列,建立佇列,將根結點入隊,取隊頭元素
}
拷貝二叉樹:
//拷貝二叉樹
pnode _copybintree(pnode proot)
return pnewroot;
}
銷毀二叉樹:
//銷毀二叉樹
void _destroybintree(pnode proot)
}
層序遍歷二叉樹:
//層序遍歷二叉樹
void _levelorder(pnode proot)
}
二叉樹節點的個數:
//二叉樹節點的個數
size_t size(pnode proot)
二叉樹葉子節點的個數:
//二叉樹葉子節點的個數
size_t _getleafcount(pnode proot)
二叉樹k層節點個數:
//二叉樹的第k層節點個數
size_t _getlevelcount(pnode proot, size_t k)
二叉樹的高度(深度):
//二叉樹的高度(深度)
size_t _height(pnode proot)
二叉樹查詢值為data的節點:
//二叉樹查詢值為data的節點
void _find(pnode proot, const t& data)
二叉樹找雙親節點:
//二叉樹找雙親節點
pnode _parent(pnode proot, pnode pnode)
二叉樹的映象:
//二叉樹的映象
void _mirror(pnode proot)//映象
判斷是否為完全二叉樹:
bool iscompletebintree()//判斷是否為完全二叉樹
else
else if (pcur->_pleft)//不飽和結點
else if (pcur->_pright)
return false;
else//不飽和結點
flag = true;
}q.pop();
} return true;
}
資料結構 二叉樹的基本操作(二)
1.理解二叉樹的基本概念和特點 2.掌握二叉樹的鏈式儲存結構 3.掌握二叉樹的基本操作 4.掌握二叉樹遍歷操作 1.實現二叉樹的如下操作,先序遍歷 中序遍歷和後序遍歷的遞迴演算法,二叉樹如下圖所示。採用二叉鏈儲存結構實現 1 採用括號表示法,構建如下二叉樹,並輸出二叉樹b 2 採用遞迴演算法,輸出二...
資料結構中二叉樹相關操作
二叉樹是一種重要的資料結構,關於二叉樹的相關操作尤為重要,其中主要操作大概分為 建樹,遍歷,返回二叉樹的相關引數。pragma once include queue.h include stack.h include include include include define max x,y x ...
資料結構 二叉樹鏈結結構基本操作
二叉樹順序儲存的優缺點 順序儲存結構就是使用陣列來儲存,順序結構操作比較簡單,對於堆結構來說,適合使用順序儲存方式來解決。但陣列只適合表示完全二叉樹,對於一般的二叉樹如果採用順序儲存方式會造成大量的空間浪費,這是我們不希望看到的。由此引出來二叉樹的鏈式儲存。並實現二叉樹的以下操作 建立二叉樹 拷貝二...