資料結構 二叉樹(包含遞迴和非遞迴版本)

2021-07-27 11:38:37 字數 2941 閱讀 3021

#pragma once

#include #include #include using namespace std;

template struct binarytreenode

};template class binarytree

binarytree(const t* arr, size_t size, const t& invalid=t())

binarytree(const binarytree& bt)

binarytree& operator=(binarytree bt)

~binarytree()

void prevorder() //先序遍歷

void prevordernonr() //先序非遞迴

node* top = s.top(); //到這,top的左子樹和自己已經訪問

s.pop();

cur = top->_rightchild; //轉化為子問題來解決訪問以top節點的右子樹

} cout << endl;

} void inorder() //中序遍歷

void inordernonr() //中序非遞迴

node* top = s.top();

cout << top->_value << " ";

s.pop();

cur = top->_rightchild;

} cout << endl;

} void postorder() //後序遍歷

void postordernonr() //後序非遞迴

node* top = s.top();

if (top->_rightchild == null || top->_rightchild == prev)

else

}cout << endl;

} void levelorder() //層序遍歷

q.push(tmp);

while (!q.empty())

if (tmp->_rightchild != null)

} cout << endl;

} size_t size()

size_t depth()

size_t getklevelsize(size_t k) //求第k層節點個數(根節點為第1層)

size_t getleafsize() //求葉子節點的個數

node* find(const t& x)

protected:

node* _creattree(const t* arr, size_t size, size_t& index, const t& invalid = t())

return tmp;

} node* _copy(node* root)

node* newroot = new node(root->_value);

newroot->_leftchild = _copy(root->_leftchild);

newroot->_rightchild = _copy(root->_rightchild);

return newroot;

} void _destroy(node* root)

}void _prevorder(node* root)

cout << root->_value<<" ";

_prevorder(root->_leftchild);

_prevorder(root->_rightchild);

} void _inorder(node* root)

_inorder(root->_leftchild);

cout << root->_value << " ";

_inorder(root->_rightchild);

} void _postorder(node* root)

_postorder(root->_leftchild);

_postorder(root->_rightchild);

cout << root->_value << " ";

} size_t _size(node* root)

return _size(root->_leftchild) + _size(root->_rightchild) + 1;

} size_t _depth(node* root)

size_t left = _depth(root->_leftchild);

size_t right = _depth(root->_rightchild);

return (left > right ? left : right)+1;

} size_t _getklevelsize(node* root, size_t k)

if (k == 1)

return _getklevelsize(root->_leftchild,k-1) + _getklevelsize(root->_rightchild,k-1);

} size_t _getleafsize(node* root)

if ((root->_leftchild == root->_rightchild) && root->_leftchild == null)

return _getleafsize(root->_leftchild) + _getleafsize(root->_rightchild);

} node* _find(node* root, const t& x)

if (root->_value == x)

node* tmp = _find(root->_leftchild, x);

if (tmp == null)

return tmp;

}protected:

node* _root; //根

};

資料結構 二叉樹的遞迴 非遞迴遍歷

複習一下二叉樹遞迴非遞迴的先中後序遍歷 寫非遞迴後序遍歷的時候卡殼了,參考了一下網上的思路,大概有兩種,一種是標記每個節點是否有走過,如果父節點的左右子節點都標記訪問過,則可以訪問父節點 一種是定義乙個指標,指向上乙個訪問的節點,如果某父節點的右子節點為null或者是上乙個訪問的節點,則該父節點應當...

資料結構 18 二叉樹(非遞迴)

二叉樹 使用非遞迴方法,建立樹 前中後序及層級遍歷樹。建立樹時,按照左子樹小於樹根,右子樹大於樹根,這樣中序遍歷就是有序表 include include 層級遍歷時,用到了queue模板類 include 前中後遍歷時,用到了stack模板類 using namespace std class n...

二叉樹 遞迴 非遞迴

include include include include using namespace std typedef struct node bintree typedef struct node1 btnode void creatbintree char s,bintree root 建立二叉...