编程练习-二叉树(父节点、非递归、O(0)空间)
来源:互联网 发布:联想网络控制工具 编辑:程序博客网 时间:2024/06/05 04:37
1、一个有父节点的二叉树,不用递归和堆栈,遍历二叉树
思路是这样的,如果采用先序遍历的方法,首先遍历根节点,然后沿左子树下降,直到遍历到最左节点,此时返回最左节点的父节点,如果父节点的右子树非空,采用相同的方式遍历右子树,如果右子树已经比遍历完毕(通过parent->right == current来判断),那么向上回溯,如果当前节点一直来自于右子树,那么继续回溯,直到根节点或者节点不是右子树为止,如果当前节点不为空,那么继续回溯,在回溯的过程中判断回溯的节点的右子树是否为空,如果不为空,则遍历右子树,知道当前节点为空为止,也就是当前节点为根节点的父节点为止。
#include <stdio.h>template<typename T>class VisitFun { public: virtual void operator()(const T& value) const = 0; virtual void operator()(const T& value, const T& parent_value) const = 0;};class VisitFunInt : public VisitFun<int> { public: virtual void operator()(const int& value) const { printf("%d ", value); } virtual void operator()(const int& value, const int& parent_value) const { printf("%d:%d ", value, parent_value); }};template<typename T>class BinaryTree { private: class TreeNode { public: TreeNode(const T& value, TreeNode* parent) : data_(value), left_(NULL), right_(NULL), parent_(parent) {} T data_; TreeNode* left_; TreeNode* right_; TreeNode* parent_; }; public: BinaryTree() : root_(NULL) {} void Insert(const T& value) { Insert(value, root_, NULL); } void InOrderVisit(const VisitFun<T>& visit_fun) { TreeNode* current = VisitLeftMost(root_, visit_fun); while (current) { current = VisitBack(current, visit_fun); } } void InOrderVisitRecursive(const VisitFun<T>& visit_fun) { InOrderVisitRecursive(root_, visit_fun); } private: void Insert(const T& value, TreeNode*& current, TreeNode* parent) { if (current == NULL) { current = new TreeNode(value, parent); } else { if (value >= current->data_) { Insert(value, current->right_, current); } else { Insert(value, current->left_, current); } } } TreeNode* VisitLeftMost(TreeNode* current, const VisitFun<T>& visit_fun) { TreeNode* parent = NULL; while(current) { visit_fun(current->data_); parent = current; current = current->left_; } return parent; } TreeNode* VisitBack(TreeNode* current, const VisitFun<T>& visit_fun) { TreeNode* parent; if (current->right_) { return VisitLeftMost(current->right_, visit_fun); } parent = current->parent_; while (parent && parent->right_ == current) { current = parent; parent = current->parent_; } return parent; } void InOrderVisitRecursive(TreeNode* current, const VisitFun<T>& visit_fun) { if (current) { if (current->parent_) { visit_fun(current->data_, current->parent_->data_); } else { T tmp; visit_fun(current->data_, tmp); } } if (current->left_) { InOrderVisitRecursive(current->left_, visit_fun); } if (current->right_) { InOrderVisitRecursive(current->right_, visit_fun); } } TreeNode* root_;};int main(int argc, char** argv) { int array[] = {3, 5, 2, 4, 7}; int array_size = sizeof(array) / sizeof(int); VisitFunInt print_int; BinaryTree<int> binary_tree; for (int i = 0; i < array_size; ++i) { binary_tree.Insert(array[i]); } // binary_tree.InOrderVisitRecursive(print_int); binary_tree.InOrderVisit(print_int);}
参考:
http://www.winzp.org/blog/archives/406
- 编程练习-二叉树(父节点、非递归、O(0)空间)
- 二叉树ADT,周游二叉树,递归非递归,求节点的父节点,兄弟节点
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
- Morris Traversal 方法遍历二叉树(非递归、不用栈,O(1)空间)
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
- 二叉树的非递归遍历(不用栈、O(1)空间)
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
- 不能在控件上调用invoke Sql2008
- vc工作区中添加文件和文件夹
- 如何阅读源码
- Android 近百个项目的源代码,覆盖Android开发的每个领域
- 上海“智慧城市”3年增2万WiFi热点 速率达54M
- 编程练习-二叉树(父节点、非递归、O(0)空间)
- Ipad(IOS 5以前)的safari浏览器下, 如何实现单指滑动Scroll ( html + Jquery 实现)
- Xtext——6. 简单的五步来支持JVM语言
- ORACLE错误一览表
- 看过《非你莫属》那期,因为刘俐俐,说说陈鸥
- 透视时代风潮之一:移动互联网催生“SoLoMo族”
- 2367
- 见人搭话:聊别人擅长或感兴趣的话题
- 坑爹的DirectX9设备丢失问题