1、二叉樹的分層遍歷(寬度優先搜索)
2、從上往下打印出二叉樹的每個節點,同層節點從左至右打印
這個和第一題基本相同,依靠vector保存訪問,queue隊列實現遍歷
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> que;
queue<TreeNode*>q;
TreeNode* fr;
if(root == NULL) return que;
q.push(root);
while(!q.empty())
{
fr=q.front();
que.push_back(fr->val);
if(fr->left != NULL)
q.push(fr->left);
if(fr->right != NULL)
q.push(fr->right);
q.pop();
}
return que;
}
3、二叉樹的前序遍歷(深度優先搜索)
void preTravel(TreeNode root)
{
if(root==NULL)
return;
stack<TreddNode>s;
s.push(root);
while(!s.empty())
{
TreeNode cur=s.top();
s.pop();
cout<<"visited "<<cur.val<<endl;
if(cur.right!=null)
s.push(cur.right);
if(cur.left!=null)
s.push(cur.left);
}
}
這裏壓入棧中的順序要注意是先右後左,因爲後進的先出。
4、給一個二叉樹,展開爲鏈表
void flatten(TreeNode root)
{
if(!root)
return;
if(root->left)
flatten(root->left);
if(root->right)
flatten(root->right);
TreeNode *tmp=root->right;
root->right=root->left;
root->left=NULL;
while(root->right)
root=root->right;
root->right=tmp;
}
5二叉樹的下一個
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。
TreeLinkNode* GetNext(TreeLinkNode* p)
{
//該節點有右子樹,則右子樹中最左面的是下一個結點
if(p->right)
{
p = p->right;
while(p->left) p = p->left;
return p;
}
//如果當前節點沒有右子樹,則一直向上找到第一個有右兒子的節點,該節點下一個就是後繼。
while(p->next && p == p->next->right) p = p->next;
return p->next;
}
6 寫出中序遍歷的非遞歸算法
藉助棧,可以將二叉樹的遞歸算法轉換爲非遞歸算法,中序遍歷先掃描根節點的所有左節點,將它們一一進棧,然後出棧一個p訪問它,掃描該節點的右子樹,將其進棧,再掃描這個右子樹中的所有左節點,如此繼續直到棧空,出棧順序就是 (左-根-右)
void InOrder2(BiTress T)
{
stack<BiTress>s;
BiTree p=T;
while(p||!s.(empty))
{
if(p)
{
s.push(p);
p=p->lchild;
}
else
{
p=s.top();
s.pop();
visit(p);
p=p->rchild;
}
}
}
時間限制:1秒 空間限制:32768K 熱度指數:221766
本題知識點: 棧 樹
題目描述
給定一棵二叉搜索樹,請找出其中的第k小的結點。例如, (5,3,7,2,4,6,8) 中,按結點數值大小順序第三小結點的值爲4。
class Solution {
public:
int count=0;
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if (pRoot != NULL)
{
TreeNode* node= KthNode(pRoot->left,k);
if (node != NULL)
return node;
count++;
if (count == k)
return pRoot;
node= KthNode(pRoot->right,k);
if (node != NULL)
return node;
}
return NULL;
}
};
後續更新在這裏
https://blog.csdn.net/weixin_44611644/article/details/97104367