面试过程中,问的最多的题目大致是可以分为两类的,一类是链表,另一类就是二叉树了,树(普通数)和B(+-)树由于稍难些,问的不是很多。
往往在问到二叉树的时候,一般都是用递归的解法,然后现场写代码。
这里,还是像上一篇文章一样,我对许多二叉树的算法进行了总结,需要下载的朋友可以去这里免积分下载:
也是像上一篇文章一样,这里我贴出二叉树代码类:
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>*); /*二叉搜索树的下一个节点*/
};