二叉樹的建立及成員函式的實現

2021-07-11 08:05:07 字數 3677 閱讀 5719

本文實現了二叉樹的建立及其成員函式的實現

成員函式包括:

1)建構函式

2)拷貝建構函式

3)賦值運算子過載

4)先序遍歷(先根遍歷)(遞迴與非遞迴)

5)中序遍歷(遞迴與非遞迴)

6)後序遍歷(後根遍歷)(遞迴與非遞迴)

7)層序遍歷

8)節點個數

9)葉子節點個數

10)二叉樹深度

11)查詢二叉樹節點

12)第k層節點的個數(兩種方法)

二叉樹的實現:

#pragma once

#include#include#include#includeusing namespace std;

templatestruct binarytreenode

t _data;//資料

binarytreenode* _left;//左孩子

binarytreenode* _right;//右孩子

};templateclass binarytree

binarytree()//預設建構函式

:_root(null)

{} binarytree(const binarytree& t)

:_root(null)

binarytree& operator=(const binarytree& t)

return *this;

} ~binarytree()

public:

node* _coptree(node* root)

return head;

} //void preorder()//遞迴實現先序遍歷

// //void inorder()//遞迴實現中序遍歷

// //void postorder()//遞迴實現後序遍歷

// void prevordernonr()//非遞迴

cout << endl;

} void inordernonr()//非遞迴

cur = s.top();

cout << cur->_data << " ";//訪問最左節點(代表該節點左節點為空或已訪問)

s.pop();

cur = cur->_right;//訪問右節點

} cout << endl;

} void postordernonr()//非遞迴

//棧頂元素為最左節點,第乙個訪問

node* top= s.top();//取到棧頂元素

if (top->_right == null || prev == top->_right)//若棧頂元素的右節點為空,或它的右節點已訪問過,則訪問該節點

else

cur = top->_right;//若給元素的右節點沒有訪問過,則將該元素的右節點壓棧

} cout << endl;

} //將其出隊,然後可訪問下一層節點

void levelorder()//層序遍歷

if (cur->_right)

q.pop();//訪問過的節點出隊

} cout << endl;

} size_t size()//二叉樹元素個數

size_t depth()//二叉樹深度

size_t leafsize()//葉子節點個數

node* find(const t& x)//查詢元素

/*size_t getklevel(size_t k)

*/ size_t getklevel(size_t k)

protected:

void destry(node* root)

} binarytreenode* _creatbinarytree(const t* a, const t& invalid, size_t size,size_t &index)

return node;

} void _preorder(node* root) }

void _inorder(node* root) }

void _postorder(node* root) }

size_t _size(node* root)

//深度(高度)

//思路:若根節點不為空,則二叉樹深度取左子樹深度和右子數深度中的最大值,

size_t _depth(node* root)

size_t ldepth = _depth(root->_left);//計算左子樹深度

size_t rdepth = _depth(root->_right);//計算右子樹深度

if (ldepth > rdepth)//取最深的值

else

return rdepth+1;//當前深度是右子樹深度+1

} size_t _leafsize(node* root)//葉子節點個數

node* _find(node* root, const t& x)//查詢節點

//void _getklevel(node* root, size_t k,size_t level,size_t& size)//第k層節點數,傳值法

// // _getklevel(root->_left, k, level + 1, size);//訪問下一層

// _getklevel(root->_right, k, level + 1, size);//訪問下一層

//}size_t _getklevel(node* cur,size_t k)//返回值方式

protected:

binarytreenode* _root;

};

測試**: 

#define _crt_secure_no_warnings

#include "binarytree.hpp"

void testbinarytree()

; int array2[15] = ;

int size = sizeof(array2) / sizeof(array2[0]);

binarytreetree(array2, '#', size);

tree.preorder();//先根遍歷

tree.inorder();//中序遍歷

tree.postorder();//後根遍歷

tree.levelorder();//層序遍歷

cout << "size:"

tree.preorder();

binarytreetree3;

tree3 = tree;//賦值

tree3.preorder();

}int main()

測試程式中array1和array2是如下二叉樹前序遍歷的結果,『#』代表為空

測試程式的結果:

array1測試用例

array2測試用例

二叉樹的實現及相關函式的實現

include include include using namespace std template struct binarynode 預設建構函式 t pdata 值域 binarynode pleftchild 左孩子 binarynode prightchild 右孩子 typedef ...

二叉樹建立及各種遍歷的實現

package com.ywx.count author vashon data 20150323 題目 二叉樹的建立和二叉樹的先序遍歷 中序遍歷 後序遍歷 class binarytree public void insert binarytree root,int data else elsee...

二叉樹的建立及遍歷

對任意的二叉樹的結點結構都可以設定為如下結構,leftchild指向該結點的左孩子,rightchild指向右孩子,data域記錄結點資訊,以此結點結構形成的二叉樹稱為二叉鍊錶。儲存結構型別為 typedef char elemtype typedef struct nodebitnode,bitr...