c_cpp 你有一个二叉树,每个节点有3个指针(左,右,侧)。设置树的最后一级的侧指针指向

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 你有一个二叉树,每个节点有3个指针(左,右,侧)。设置树的最后一级的侧指针指向相关的知识,希望对你有一定的参考价值。

/*
You have a binary tree with each node having 3 pointers (left, right, side). Set the side pointers 
of the last level of the tree to point to their nearby node
*/
struct TreeNode {
    int val;
    TreeNode *left, *right, *side;
};

int get_max_height(TreeNode *root) {
    if(!root) return 0;
    if(!root->left && !root->right) return 1;
    int HL = get_max_height(root->left), HR = get_max_height(root->right);
    return HL > HR ? HL + 1 : HR + 1;
}

void set_side_pointer(TreeNode *root) {
    if(!root) return;
    deque<TreeNode*> q;
    q.push_back(root);
    int max_height = get_max_height(root);
    int level1 = 1, level2 = 0, curr_height = 1;
    vector<TreeNode*> leaves;
    while(!q.empty()) {
        TreeNode *cur = q.front();
        q.pop_front();
        if(curr_height == max_height) {
            leaves.push_back(cur);
        }
        level1--;
        if(cur->left) {
            q.push_back(cur->left);
            level2++;
        }
        if(cur->right) {
            q.push_back(cur->right);
            level2++;
        }
        if(level1 == 0) {
            curr_height++;
            level1 = level2;
            level2 = 0;
        }
    }
    for(int i=0; i<leaves.size()-1; ++i)
        leaves[i]->side = leaves[i+1];
}

int main()
{
                    TreeNode *r = new TreeNode(3);
            r->left = new TreeNode(2);  r->right = new TreeNode(4);
    r->left->left = new TreeNode(1); r->right->right = new TreeNode(5);
    
    set_side_pointer(r);
    cout << r->left->left->side->val << endl;
}

以上是关于c_cpp 你有一个二叉树,每个节点有3个指针(左,右,侧)。设置树的最后一级的侧指针指向的主要内容,如果未能解决你的问题,请参考以下文章

二叉树与二叉搜索树

(原创)线索二叉树那点小破事

数据结构(十四)——二叉树

二叉树-二叉链表-先序遍历

116. 填充每个节点的下一个右侧节点指针

116. 填充每个节点的下一个右侧节点指针