不用额外空间,链接二叉树同一层的每个node
生活随笔
收集整理的這篇文章主要介紹了
不用额外空间,链接二叉树同一层的每个node
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
比如:
? ?? ?? ???0
? ?? ? 1? ?? ? 2
? ?3? ?? ?4? ?? ?? ?5
? ?? ?6? ?? ?? ? 7?
1->2
3->4->5
6->7
參考數據結構:
struct TREE_NODE
{
? ? ? ? TREE_NODE(int n) : nVal(n), pLft(NULL), pRgt(NULL), pSib(NULL)
? ? ? ? {}
? ? ? ? int nVal;
? ? ? ? TREE_NODE* pLft;
? ? ? ? TREE_NODE* pRgt;
? ? ? ? TREE_NODE* pSib;
? ?? ?? ???0
? ?? ? 1? ?? ? 2
? ?3? ?? ?4? ?? ?? ?5
? ?? ?6? ?? ?? ? 7?
1->2
3->4->5
6->7
參考數據結構:
struct TREE_NODE
{
? ? ? ? TREE_NODE(int n) : nVal(n), pLft(NULL), pRgt(NULL), pSib(NULL)
? ? ? ? {}
? ? ? ? int nVal;
? ? ? ? TREE_NODE* pLft;
? ? ? ? TREE_NODE* pRgt;
? ? ? ? TREE_NODE* pSib;
};
在想這個題目的時候,有兩個難點無法克服:
1. 左子樹在遞歸過程中,需要用到右子樹,所以要求右子樹先遞歸遍歷,最后在遞歸左子樹
2. 如果一個節點沒有子節點,如果將前一個節點的指針指向他后一個指針。
下面的算法可以將上面的兩個問題解決
struct Node {Node *left;Node *right;Node *sib; };Node *find_next(Node *root) {while (root = root->sib) {if (root->left | root->right)return root->left ? root->left : root->right;}return NULL; }void linkLevelNodes(Node *root) {if (root == NULL)return;if (root->left)root->left->sib = root->right ? root->right : find_next(root);if (root->right)root->right->sib = find_next(root);linkLevelNodes(root->right);linkLevelNodes(root->left); }
總結
以上是生活随笔為你收集整理的不用额外空间,链接二叉树同一层的每个node的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求数组中元素为另外两个元素和的最大元素
- 下一篇: 数组分割