mthoutai

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

      面试过程中。问的最多的题目大致是能够分为两类的。一类是链表。还有一类就是二叉树了,树(普通数)和B(+-)树因为稍难些,问的不是非常多。

      往往在问到二叉树的时候。一般都是用递归的解法。然后现场写代码。

      这里,还是像上一篇文章一样,我对很多二叉树的算法进行了总结。须要下载的朋友能够去这里免积分下载:

http://download.csdn.net/detail/dlutbrucezhang/8066557

      也是像上一篇文章一样,这里我贴出二叉树代码类:

template <typename T>
class dutBinNode
{
public :
	T data;
	dutBinNode<T>* lChild;
	dutBinNode<T>* rChild;
};

template <typename T>
class dutBinTree
{
private :
	dutBinNode<T>* pRoot;

protected :		/*包裹函数*/
	void dutDeleteBinTree(dutBinNode<T>*);				/*销毁二叉树*/
	void dutCreateBinTree(dutBinNode<T>**);				/*创建二叉树*/
	void dutRecursionPreOrder(dutBinNode<T>*);			/*递归前序遍历*/
	void dutRecursionInOrder(dutBinNode<T>*);			/*递归中序遍历*/
	void dutRecursionPostOrder(dutBinNode<T>*);			/*递归后序遍历*/
	void dutNotRecursionPreOrder(dutBinNode<T>*);		/*非递归前序遍历*/
	void dutNotRecursionInOrder(dutBinNode<T>*);		/*非递归中序遍历*/
	void dutNotRecursionPostOrder(dutBinNode<T>*);		/*非递归后序遍历*/
	void dutLevelTraverseNoBranch(dutBinNode<T>*);		/*不分行层次遍历*/
	void dutLevelTraverseHasBranch(dutBinNode<T>*);		/*分行层次遍历*/
	void dutDepthFirstSearch(dutBinNode<T>*);			/*深度优先遍历*/
	void dutBreadthFirstSearch(dutBinNode<T>*);			/*广度优先遍历*/
	int  dutDepthOfTree(dutBinNode<T>*);				/*树的高度*/
	int  dutNodeCountOfTree(dutBinNode<T>*);			/*树中节点个数*/
	int  dutLeafNodeCountOfTree(dutBinNode<T>*);		/*树中叶子节点个数*/
	int  dutNodeCountInLevelK(dutBinNode<T>*, int);		/*第k层节点个数*/
	int  dutPrintNodeInLevelK(dutBinNode<T>*, int);		/*打印第K层节点*/
	bool dutIsBalanceBinTree(dutBinNode<T>*, int&);		/*是否是平衡二叉树*/
	bool dutIsCompleteBinTree(dutBinNode<T>*);			/*是否是全然二叉树*/
	/*推断是否是子树*/
	bool dutDoesTree1HaveTree2(dutBinNode<T>*, dutBinNode<T>*);
	bool dutIsTreeHasSubTree(dutBinNode<T>*, dutBinNode<T>*);
	void dutNotRecursionTreeMirroring(dutBinNode<T>*);	/*非递归树的镜像*/
	void dutRecursionTreeMirroring(dutBinNode<T>*);		/*递归树的镜像*/
	/*寻找和为某一值的路径*/
	void dutFindPathEqualSum(dutBinNode<T>*, int, std :: vector<int>&, int);
	/*二叉搜索树转换为双向链表*/
	dutBinNode<T>* dutCluesBinTreeConvertToDoubleList(dutBinNode<T>*, dutBinNode<T>* &);
	/*递归树中两个节点的最低公共祖先*/
	dutBinNode<T>* dutRecursionGetLastCommonParent(dutBinNode<T>* ,dutBinNode<T>*, dutBinNode<T>*);
	/*非递归树中两个节点的最低公共祖先*/
	//bool dutNotRecursionGetLastCommonParent(dutBinNode<T>* ,dutBinNode<T>*, std :: vector<dutBinNode<T>*>&);
	bool dutCmpStructOfTree(dutBinNode<T>*, dutBinNode<T>*);		/*推断两棵树的结构是否同样,不考虑元素*/
	bool dutCmpTreeIsEqual(dutBinNode<T>*, dutBinNode<T>*);			/*推断两棵树是否同样,考虑元素*/
	int  dutMaxDistBetweenNodes(dutBinNode<T>*, int&);				/*二叉树中节点间的最大距离*/
	dutBinNode<T>* dutMinNodeInCluseBinTree(dutBinNode<T>*);			/*二叉排序树中寻找最小值节点*/
	dutBinNode<T>* dutMaxNodeInCluseBinTree(dutBinNode<T>*);			/*二叉排序树中寻找最大值节点*/
	dutBinNode<T>* dutFindNearestBigNode(dutBinNode<T>*, T _data);		/*距离data近期且大于data的节点*/
	dutBinNode<T>* dutFindNearestSmallNode(dutBinNode<T>*, T _data);	/*距离data近期且小于data的节点*/			

public :
	dutBinTree<T>() : pRoot(NULL) {}
	~dutBinTree<T>();

	void dutCreateBinTree();				/*创建二叉树*/

	void dutRecursionPreOrder();			/*递归前序遍历*/
	void dutRecursionInOrder();				/*递归中序遍历*/
	void dutRecursionPostOrder();			/*递归后序遍历*/

	void dutNotRecursionPreOrder();			/*非递归前序遍历*/
	void dutNotRecursionInOrder();			/*非递归中序遍历*/
	void dutNotRecursionPostOrder();		/*非递归后序遍历*/

	void dutLevelTraverseNoBranch();		/*不分行层次遍历*/
	void dutLevelTraverseHasBranch();		/*分行层次遍历*/

	void dutDepthFirstSearch();				/*深度优先遍历*/
	void dutBreadthFirstSearch();			/*广度优先遍历*/

	/*algorithm*/
	int  dutDepthOfTree();										/*树的高度*/
	int  dutNodeCountOfTree();									/*树中节点个数*/
	int  dutLeafNodeCountOfTree();								/*树中叶子节点个数*/
	int  dutNodeCountInLevelK(int);								/*第k层节点个数*/
	int  dutPrintNodeInLevelK(int);								/*打印第K层节点*/
	bool dutIsBalanceBinTree();									/*是否是平衡二叉树*/
	bool dutIsCompleteBinTree();								/*是否是全然二叉树*/
	bool dutIsTreeHasSubTree(dutBinTree<T>);					/*推断是否是子树*/
	void dutNotRecursionTreeMirroring();						/*非递归树的镜像*/
	void dutRecursionTreeMirroring();							/*递归树的镜像*/
	void dutFindPathEqualSum(int, std :: vector<int>&);			/*寻找和为某一值的路径*/
	dutBinNode<T>* dutCluesBinTreeConvertToDoubleList();		/*二叉搜索树转换为双向链表(破坏了封装)*/
	dutBinNode<T>* dutBinFindInBinSearchTree(int);				/*二分查找树中寻找一个数(破坏了封装)*/
	/*递归树中两个节点的最低公共祖先(破坏了封装)*/
	dutBinNode<T>*	dutRecursionGetLastCommonParent(dutBinNode<T>*, dutBinNode<T>*);
	/*非递归树中两个节点的最低公共祖先(破坏了封装)*/
	//dutBinNode<T>* dutNotRecursionGetLastCommonParent(dutBinNode<T>*, dutBinNode<T>*);
	bool dutCmpStructOfTree(dutBinTree<T>);		/*推断两棵树的结构是否同样。不考虑元素*/
	bool dutCmpTreeIsEqual(dutBinTree<T>);		/*推断两棵树是否同样,考虑元素*/
	int  dutMaxDistBetweenNodes();				/*二叉树中节点间的最大距离*/
	/*破坏了封装*/
	dutBinNode<T>* dutMinNodeInCluseBinTree();			/*二叉排序树中寻找最小值节点*/
	dutBinNode<T>* dutMaxNodeInCluseBinTree();			/*二叉排序树中寻找最大值节点*/
	dutBinNode<T>* dutFindNearestBigNode(T _data);		/*距离data近期且大于data的节点*/
	dutBinNode<T>* dutFindNearestSmallNode(T _data);	/*距离data近期且小于data的节点*/
	dutBinNode<T>* dutFindNextNodeInClueBinTree(dutBinNode<T>*);	/*二叉搜索树的下一个节点*/
};


posted on 2017-05-04 19:59  mthoutai  阅读(194)  评论(0编辑  收藏  举报