一,给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针next
1. 该节点存在右子节点,则下一个节点是右子树的最左节点。
2. 该节点不存在右子节点,则下一个节点是该节点的第一个父子关系为左的祖先节点中的父节点, 因为如果遍历的节点是父节点的右节点说明父节点已遍历过了
#include<cstdlib>
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(NULL==pNode)return pNode;
if(pNode->right==NULL)
{
if(NULL==pNode->right)
{
while(pNode && pNode->next && pNode==pNode->next->right)
pNode = pNode->next;
return pNode->next;
}
}
pNode = pNode->right;
while(pNode&&pNode->left)
pNode =pNode->left;
return pNode;
}
};
二,判断一棵树是不是对称的
#include<cstdlib>
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot)
{
if(pRoot==NULL)
return true;
return isMirror(pRoot->left,pRoot->right);
}
bool isMirror(TreeNode* Left,TreeNode* Right){
if(Left==NULL && Right==NULL)
return true;
if(Left==NULL || Right==NULL)
return false;
if(Left->val!=Right->val)
return false;
return (isMirror(Left->left,Right->right));
}
};