二叉树面试题:判断树是否为完全二叉树和求二叉树的镜像

来源:互联网 发布:质量好的淘宝店推荐 编辑:程序博客网 时间:2024/06/05 15:56

1、判断二叉树是否为完全二叉树:

层序遍历,从上到下,从左到右,遍历二叉树

当遇到一个节点的左子树为空时,则该节点的右子树为空和后面遍历的节点都为叶子节点,否则不是完全二叉树。

当该节点只有左子树时,且该子树为叶子结点,否则不为完全二叉树。

判断实现:

bool _IsCompleteBinaryTree(BinaryTreeNode<T>* pRoot){if(pRoot == NULL)return false;queue<BinaryTreeNode<T>*> q;q.push(pRoot);bool IsOnlyLeft = false;bool ret = true;while(!q.empty()){BinaryTreeNode<T>* pNode = q.front();q.pop();if(IsOnlyLeft)//找到了只有左子树的节点{if(pNode->_Left != NULL || pNode->_Right != NULL){ret = false;//不是完全二叉树break;}}else{if(pNode->_Left != NULL && pNode->_Right != NULL){q.push(pNode->_Left);q.push(pNode->_Right);}else if(pNode->_Left != NULL && pNode->_Right == NULL){IsOnlyLeft = true; //找到只有左子树的节点q.push(pNode->_Left);}else if(pNode->_Left == NULL && pNode->_Right != NULL){ret = false;break;}else{IsOnlyLeft = true;}}}return ret;}

2、求二叉树的镜像

递归:

void _Mirror(BinaryTreeNode<T>*& pRoot){if(pRoot == NULL)return;BinaryTreeNode<T>* Left = _Mirror(pRoot->_Left);BinaryTreeNode<T>* Right = _Mirror(pRoot->_Right);pRoot->_Left = Right;pRoot->_Right = Left;}

非递归:循环(栈)

void _Mirror_nor(BinaryTreeNode<T>*& pRoot)  {      if(NULL == pRoot)          return;        stack<BinaryTreeNode<T>*> stackTreeNode;      stackTreeNode.push(pRoot);        while(stackTreeNode.size())      {          BinaryTreeNode<T>* pNode = stackTreeNode.top();          stackTreeNode.pop();            if(NULL != pNode->Left || NULL != pNode->Right)          {              BinaryTreeNode<T>* pTemp = pNode->Left;              pNode->Left = pNode->Right;              pNode->Right = pTemp;          }                    if(NULL != pNode->Left)              stackTreeNode.push(pNode->Left);            if(NULL != pNode->Right)              stackTreeNode.push(pNode->Right);      }  }


阅读全文
0 0
原创粉丝点击