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); }
}