1. 二叉樹的先序、中序、後序非遞歸遍歷
void preOrder(Node *root)
{
if(!root) return ;
stack<Node *> s;
s.push(root);
while(!s.empty())
{
Node *node = s.top();
cout<<node->val<<" ";
s.pop();
if(node->right)
s.push(node->right);
if(node->left)
s.push(node->left);
}
}
void inOrder(Node *root)
{
if(!root) return ;
stack<Node *> s;
Node *node = s.top();
while(!s.empty() || node)
{
if(node)
{
s.push(node);
node = node->left;
}else{
Node *tmp = s.top();
cout<<tmp->val<<" ";
s.pop();
node = node->right;
}
}
}
void postOrder(Node *root)
{
if(!root) return ;
stack<Node *> s; //中 右 左
s.push(root);
stack<Node *> s1; //左 右 中
while(!s.empty())
{
Node *node = s1.top();
s1.pop();
s1.push(node);
if(node->left)
s.push(node->left);
if(node->right)
s.push(node->right);
}
while(!s1.empty())
{
Node *node = s1.top();
cout<<node->val<<" ";
s1.pop();
}
}
2.在二叉樹中找到一個節點的後繼節點
後繼:中序遍歷中節點的下一個節點
前驅:中序遍歷中節點的上一個節點
struct Node
{
int val;
Node *parent;
Node *left;
Node *right;
};
Node *getSuccessorNode(Node *node)
{
if(!node) return NULL;
if(node->right)
return getLeftMost(node->right);
else{
Node *pNode = node->parent;
while(!pNode && pNode->left != node) //!pNode 考慮中序最後一個節點
{
node = pNode;
pNode = node->parent;
}
return pNode;
}
}
Node *getLeftMost(Node *node)
{
if(!node) return NULL;
while(node->left)
node = node->left;
return node;
}
3.判斷一棵二叉樹是否是平衡二叉樹
class ReturnData
{
public:
bool isB;
int height;
ReturnData(bool isB, int h)
{
this.isB = isB;
this.height = h;
}
}
bool isBalance(Node *root)
{
return process(root).isB;
}
ReturnData process(Node *node)
{
if(!node) return new ReturnData(true, 0);
ReturnData lTree = process(node->left); //判斷左子樹是否平衡
if(!lTree.isB)
return new ReturnData(false, 0);
ReturnData rTree = process(node->right);
if(!rTree.isB)
return new ReturnData(false, 0);
if(abs(lTree.height-rTree.height) > 1)
return new ReturnData(false, 0);
return new ReturnData(true, 1+max(lTree.height, rTree.height));
}
4. 判斷一棵樹是否是完全二叉樹
bool isComplete(Node *root)
{
if(!root) return true;
queue<Node *> q;
bool state = false; //若爲true 則之後遍歷到的節點都爲葉子
q.push(root);
while(!q.empty())
{
Node *node = q.front();
if( (!node->left&&node->right) || (state && (node->right||node->left)) )
return false;
if(node->left)
q.push(node->left);
if(node->right)
q.push(node->right);
if(node->left && !node->right) //右子樹爲空
state = true;
}
return true;
}
5.已知一棵完全二叉樹,求其節點的個數
int nodeNum(Node *root)
{
if(!root) return 0;
return help(head, 1, mostLeftLevel(head, 1));
}
int mostLeftLevel(Node *node, int h)
{
while(node && node->left)
{
node = node->left;
h++;
}
return h;
}
int help(Node *node, int level, int h) //返回第level層以node爲根節點的子樹個數
{
if(level == h)
return 1;
if(mostLeftLevel(node->right, level) == h) //右子樹高度達到整棵樹高度,則左子樹爲滿二叉樹
return (1<<(h-level)) + help(node->right, level+1, h);
else
return (1<<(h-level-1)) + help(node->left, levle=1, h);
}