二叉树的概念,这里就不想多说了,但是你需要知道满二叉树,完全二叉树等等这些基本
概念,下边进入正题。
首先创建一棵二叉树,下边看代码:
Node* _Create(T* a,size_t size,size_t& index,const T& invalid) { assert(a); Node* root = NULL; while (index < size && a[index] != invalid) { root = new Node(a[index]); root->_left = _Create(a,size,++index,invalid); root->_right = _Create(a,invalid); } return root; }
这里需要注意的就是对数组a的断言。养成好的习惯,该断言就断言。还有就是index这
个必须是引用,因为每个元素只访问一次,也就是外部改的index,内部也需要改。所以
,就是传引用。
二叉树的销毁:
void _Destroy(Node* root) { if (root == NULL) return; _Destroy(root->_left); _Destroy(root->_right); }
递归代码,看着很简单,但是别忘了销毁,否则内存泄漏。
二叉树的三种遍历----前序,中序,后序
void _PreOrder(Node* root) { Node* cur = root; if (cur != NULL) { cout << cur->_data<<" "; _PreOrder(cur->_left); _PreOrder(cur->_right); } } void _InOrder(Node* root) { Node* cur = root; if (cur != NULL) { _InOrder(cur->_left); cout << cur->_data<<" "; _InOrder(cur->_right); } } void _PostOrder(Node* root) { Node* cur = root; if (cur != NULL) { _PostOrder(cur->_left); _PostOrder(cur->_right); cout << cur->_data<<" "; } }
层序遍历:
void _TiertOrder(Node* root) { queue<Node*> q; Node* cur = root; q.push(cur); while (!q.empty()) { Node* tmp = q.front(); cout << tmp->_data << " "; if (tmp->_left) { q.push(tmp->_left); } if (tmp->_right) { q.push(tmp->_right); } q.pop(); } }
这个过程用到了队列,这里就讲一下思路吧:如果不是空树,根节点入队,如果入队结
点的子树不为空,将子树也入队,入队之后弹出根节点,下边以此类推。比如跟的左孩
子存在,并且已经入队,如果左孩子有左右孩子,将左右孩子也入队,弹出开始入队的
左孩子。
二叉树的深度:
size_t _Depth(Node* root) { if (root == NULL) return 0; size_t left = _Depth(root->_left); size_t right = _Depth(root->_right); return left > right ? left + 1 : right + 1; }
递归过程比较耗时,所以上边的两个变量是很有必要的,永远不要为了代码看着简洁而
不考虑计算机的感受。
二叉树的结点个数:
size_t _Size(Node* root) { if (root == NULL) return 0; return _Size(root->_left) + _Size(root->_right) + 1; }
二叉树中元素的查找
Node* _Find(Node* root,const T& x) { Node* cur = root; if (cur == NULL) return NULL; if (cur->_data == x) return cur; //左子树没有找到才会去遍历 右子树 if (!_Find(cur->_left,x)) _Find(cur->_right,x); }
好了,关于二叉树的递归实现就到这里--
原文链接:https://www.f2er.com/datastructure/382443.html