Skip to content
Merged
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
e3f51e6
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
64aa843
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
c59a81c
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
2ed09ab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
5cb6799
infix to prefix missing feature added (comments)
Arunsiva003 Oct 2, 2023
56f6ff8
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 2, 2023
a8a9a6f
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
c8d12c9
infix to prefix missing feature added (comments)
Arunsiva003 Oct 2, 2023
c2caec5
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
b51c2a2
newly updated infix_to_prefix
Arunsiva003 Oct 3, 2023
da601b7
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 3, 2023
2c4166f
newly updated infix_to_prefix_2
Arunsiva003 Oct 3, 2023
b0f71e9
newly updated infix_to_prefix_3
Arunsiva003 Oct 3, 2023
71f9365
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 4, 2023
1931aee
from the beginning
Arunsiva003 Oct 4, 2023
922af56
Created flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
4b7f3c2
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
c07f0ee
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
16e1edd
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
f55280a
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
599c2d9
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
c7a79b8
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
cdc2b4d
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
199e3fe
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
e7f0809
Update flatten_binarytree_to_linkedlist.py (space added)
Arunsiva003 Oct 4, 2023
ba58a13
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
79608ab
Update flatten_binarytree_to_linkedlist.py space added
Arunsiva003 Oct 4, 2023
b8f2bda
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
6cc0235
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
81797ab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
fd55b9e
flatten binary tree to linked list - 1
Arunsiva003 Oct 4, 2023
74320a1
Merge branch 'Arunsiva003-patch-1-flattenTree' of https://github.com/…
Arunsiva003 Oct 4, 2023
4132662
flatten binary tree to linked list final
Arunsiva003 Oct 4, 2023
924b5b6
flatten binary tree to linked list final
Arunsiva003 Oct 4, 2023
9504a42
review updated
Arunsiva003 Oct 4, 2023
b356328
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
a9a35b6
Update .pre-commit-config.yaml
cclauss Oct 4, 2023
7c1a2f6
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
5a78f7d
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 138 additions & 0 deletions data_structures/binary_tree/flatten_binarytree_to_linkedlist.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
"""
Comment thread
Arunsiva003 marked this conversation as resolved.
Binary Tree Flattening Algorithm

This code defines an algorithm to flatten a binary tree into a linked list
represented using the right pointers of the tree nodes. It uses in-place
flattening and demonstrates the flattening process along with a display
function to visualize the flattened linked list.
https://www.geeksforgeeks.org/flatten-a-binary-tree-into-linked-list

Author: Arunkumar A
Date: 04/09/2023
"""
from __future__ import annotations


class TreeNode:
"""
A TreeNode has data variable and pointers to TreeNode objects
for its left and right children.
"""

def __init__(self, data: int) -> None:
self.data = data
self.left: TreeNode | None = None
self.right: TreeNode | None = None


def build_tree() -> TreeNode:
"""
Build and return a sample binary tree.

Returns:
TreeNode: The root of the binary tree.

Examples:
>>> root = build_tree()
>>> root.data
1
>>> root.left.data
2
>>> root.right.data
5
>>> root.left.left.data
3
>>> root.left.right.data
4
>>> root.right.right.data
6
"""
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(5)
root.left.left = TreeNode(3)
root.left.right = TreeNode(4)
root.right.right = TreeNode(6)
return root


def flatten(root: TreeNode | None) -> None:
"""
Flatten a binary tree into a linked list in-place, where the linked list is
represented using the right pointers of the tree nodes.

Args:
root (TreeNode): The root of the binary tree to be flattened.

Examples:
>>> root = TreeNode(1)
>>> root.left = TreeNode(2)
>>> root.right = TreeNode(5)
>>> root.left.left = TreeNode(3)
>>> root.left.right = TreeNode(4)
>>> root.right.right = TreeNode(6)
>>> flatten(root)
>>> root.data
1
>>> root.right.right is None
False
>>> root.right.right = TreeNode(3)
>>> root.right.right.right is None
True
"""
if not root:
return

# Flatten the left subtree
flatten(root.left)

# Save the right subtree
right_subtree = root.right

# Make the left subtree the new right subtree
root.right = root.left
root.left = None

# Find the end of the new right subtree
current = root
while current.right:
current = current.right

# Append the original right subtree to the end
current.right = right_subtree

# Flatten the updated right subtree
flatten(right_subtree)


def display_linked_list(root: TreeNode | None) -> None:
"""
Display the flattened linked list.

Args:
root (TreeNode | None): The root of the flattened linked list.

Examples:
>>> root = TreeNode(1)
>>> root.right = TreeNode(2)
>>> root.right.right = TreeNode(3)
>>> display_linked_list(root)
1 2 3
>>> root = None
>>> display_linked_list(root)

"""
current = root
while current:
if current.right is None:
print(current.data, end="")
break
print(current.data, end=" ")
current = current.right


if __name__ == "__main__":
print("Flattened Linked List:")
root = build_tree()
flatten(root)
display_linked_list(root)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Arunsiva003 patch 1 flatten tree by Arunsiva003 · Pull Request #9695 · TheAlgorithms/Python · GitHub
Skip to content
Merged
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
e3f51e6
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
64aa843
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
c59a81c
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
2ed09ab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
5cb6799
infix to prefix missing feature added (comments)
Arunsiva003 Oct 2, 2023
56f6ff8
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 2, 2023
a8a9a6f
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
c8d12c9
infix to prefix missing feature added (comments)
Arunsiva003 Oct 2, 2023
c2caec5
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
b51c2a2
newly updated infix_to_prefix
Arunsiva003 Oct 3, 2023
da601b7
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 3, 2023
2c4166f
newly updated infix_to_prefix_2
Arunsiva003 Oct 3, 2023
b0f71e9
newly updated infix_to_prefix_3
Arunsiva003 Oct 3, 2023
71f9365
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 4, 2023
1931aee
from the beginning
Arunsiva003 Oct 4, 2023
922af56
Created flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
4b7f3c2
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
c07f0ee
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
16e1edd
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
f55280a
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
599c2d9
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
c7a79b8
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
cdc2b4d
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
199e3fe
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
e7f0809
Update flatten_binarytree_to_linkedlist.py (space added)
Arunsiva003 Oct 4, 2023
ba58a13
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
79608ab
Update flatten_binarytree_to_linkedlist.py space added
Arunsiva003 Oct 4, 2023
b8f2bda
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
6cc0235
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
81797ab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
fd55b9e
flatten binary tree to linked list - 1
Arunsiva003 Oct 4, 2023
74320a1
Merge branch 'Arunsiva003-patch-1-flattenTree' of https://github.com/…
Arunsiva003 Oct 4, 2023
4132662
flatten binary tree to linked list final
Arunsiva003 Oct 4, 2023
924b5b6
flatten binary tree to linked list final
Arunsiva003 Oct 4, 2023
9504a42
review updated
Arunsiva003 Oct 4, 2023
b356328
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
a9a35b6
Update .pre-commit-config.yaml
cclauss Oct 4, 2023
7c1a2f6
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
5a78f7d
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 138 additions & 0 deletions data_structures/binary_tree/flatten_binarytree_to_linkedlist.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
"""
Comment thread
Arunsiva003 marked this conversation as resolved.
Binary Tree Flattening Algorithm

This code defines an algorithm to flatten a binary tree into a linked list
represented using the right pointers of the tree nodes. It uses in-place
flattening and demonstrates the flattening process along with a display
function to visualize the flattened linked list.
https://www.geeksforgeeks.org/flatten-a-binary-tree-into-linked-list

Author: Arunkumar A
Date: 04/09/2023
"""
from __future__ import annotations


class TreeNode:
"""
A TreeNode has data variable and pointers to TreeNode objects
for its left and right children.
"""

def __init__(self, data: int) -> None:
self.data = data
self.left: TreeNode | None = None
self.right: TreeNode | None = None


def build_tree() -> TreeNode:
"""
Build and return a sample binary tree.

Returns:
TreeNode: The root of the binary tree.

Examples:
>>> root = build_tree()
>>> root.data
1
>>> root.left.data
2
>>> root.right.data
5
>>> root.left.left.data
3
>>> root.left.right.data
4
>>> root.right.right.data
6
"""
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(5)
root.left.left = TreeNode(3)
root.left.right = TreeNode(4)
root.right.right = TreeNode(6)
return root


def flatten(root: TreeNode | None) -> None:
"""
Flatten a binary tree into a linked list in-place, where the linked list is
represented using the right pointers of the tree nodes.

Args:
root (TreeNode): The root of the binary tree to be flattened.

Examples:
>>> root = TreeNode(1)
>>> root.left = TreeNode(2)
>>> root.right = TreeNode(5)
>>> root.left.left = TreeNode(3)
>>> root.left.right = TreeNode(4)
>>> root.right.right = TreeNode(6)
>>> flatten(root)
>>> root.data
1
>>> root.right.right is None
False
>>> root.right.right = TreeNode(3)
>>> root.right.right.right is None
True
"""
if not root:
return

# Flatten the left subtree
flatten(root.left)

# Save the right subtree
right_subtree = root.right

# Make the left subtree the new right subtree
root.right = root.left
root.left = None

# Find the end of the new right subtree
current = root
while current.right:
current = current.right

# Append the original right subtree to the end
current.right = right_subtree

# Flatten the updated right subtree
flatten(right_subtree)


def display_linked_list(root: TreeNode | None) -> None:
"""
Display the flattened linked list.

Args:
root (TreeNode | None): The root of the flattened linked list.

Examples:
>>> root = TreeNode(1)
>>> root.right = TreeNode(2)
>>> root.right.right = TreeNode(3)
>>> display_linked_list(root)
1 2 3
>>> root = None
>>> display_linked_list(root)

"""
current = root
while current:
if current.right is None:
print(current.data, end="")
break
print(current.data, end=" ")
current = current.right


if __name__ == "__main__":
print("Flattened Linked List:")
root = build_tree()
flatten(root)
display_linked_list(root)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Arunsiva003 patch 1 flatten tree by Arunsiva003 · Pull Request #9695 · TheAlgorithms/Python · GitHub
Skip to content
Merged
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
e3f51e6
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
64aa843
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
c59a81c
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
2ed09ab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
5cb6799
infix to prefix missing feature added (comments)
Arunsiva003 Oct 2, 2023
56f6ff8
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 2, 2023
a8a9a6f
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
c8d12c9
infix to prefix missing feature added (comments)
Arunsiva003 Oct 2, 2023
c2caec5
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
b51c2a2
newly updated infix_to_prefix
Arunsiva003 Oct 3, 2023
da601b7
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 3, 2023
2c4166f
newly updated infix_to_prefix_2
Arunsiva003 Oct 3, 2023
b0f71e9
newly updated infix_to_prefix_3
Arunsiva003 Oct 3, 2023
71f9365
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 4, 2023
1931aee
from the beginning
Arunsiva003 Oct 4, 2023
922af56
Created flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
4b7f3c2
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
c07f0ee
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
16e1edd
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
f55280a
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
599c2d9
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
c7a79b8
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
cdc2b4d
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
199e3fe
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
e7f0809
Update flatten_binarytree_to_linkedlist.py (space added)
Arunsiva003 Oct 4, 2023
ba58a13
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
79608ab
Update flatten_binarytree_to_linkedlist.py space added
Arunsiva003 Oct 4, 2023
b8f2bda
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
6cc0235
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
81797ab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
fd55b9e
flatten binary tree to linked list - 1
Arunsiva003 Oct 4, 2023
74320a1
Merge branch 'Arunsiva003-patch-1-flattenTree' of https://github.com/…
Arunsiva003 Oct 4, 2023
4132662
flatten binary tree to linked list final
Arunsiva003 Oct 4, 2023
924b5b6
flatten binary tree to linked list final
Arunsiva003 Oct 4, 2023
9504a42
review updated
Arunsiva003 Oct 4, 2023
b356328
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
a9a35b6
Update .pre-commit-config.yaml
cclauss Oct 4, 2023
7c1a2f6
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
5a78f7d
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 138 additions & 0 deletions data_structures/binary_tree/flatten_binarytree_to_linkedlist.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
"""
Comment thread
Arunsiva003 marked this conversation as resolved.
Binary Tree Flattening Algorithm

This code defines an algorithm to flatten a binary tree into a linked list
represented using the right pointers of the tree nodes. It uses in-place
flattening and demonstrates the flattening process along with a display
function to visualize the flattened linked list.
https://www.geeksforgeeks.org/flatten-a-binary-tree-into-linked-list

Author: Arunkumar A
Date: 04/09/2023
"""
from __future__ import annotations


class TreeNode:
"""
A TreeNode has data variable and pointers to TreeNode objects
for its left and right children.
"""

def __init__(self, data: int) -> None:
self.data = data
self.left: TreeNode | None = None
self.right: TreeNode | None = None


def build_tree() -> TreeNode:
"""
Build and return a sample binary tree.

Returns:
TreeNode: The root of the binary tree.

Examples:
>>> root = build_tree()
>>> root.data
1
>>> root.left.data
2
>>> root.right.data
5
>>> root.left.left.data
3
>>> root.left.right.data
4
>>> root.right.right.data
6
"""
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(5)
root.left.left = TreeNode(3)
root.left.right = TreeNode(4)
root.right.right = TreeNode(6)
return root


def flatten(root: TreeNode | None) -> None:
"""
Flatten a binary tree into a linked list in-place, where the linked list is
represented using the right pointers of the tree nodes.

Args:
root (TreeNode): The root of the binary tree to be flattened.

Examples:
>>> root = TreeNode(1)
>>> root.left = TreeNode(2)
>>> root.right = TreeNode(5)
>>> root.left.left = TreeNode(3)
>>> root.left.right = TreeNode(4)
>>> root.right.right = TreeNode(6)
>>> flatten(root)
>>> root.data
1
>>> root.right.right is None
False
>>> root.right.right = TreeNode(3)
>>> root.right.right.right is None
True
"""
if not root:
return

# Flatten the left subtree
flatten(root.left)

# Save the right subtree
right_subtree = root.right

# Make the left subtree the new right subtree
root.right = root.left
root.left = None

# Find the end of the new right subtree
current = root
while current.right:
current = current.right

# Append the original right subtree to the end
current.right = right_subtree

# Flatten the updated right subtree
flatten(right_subtree)


def display_linked_list(root: TreeNode | None) -> None:
"""
Display the flattened linked list.

Args:
root (TreeNode | None): The root of the flattened linked list.

Examples:
>>> root = TreeNode(1)
>>> root.right = TreeNode(2)
>>> root.right.right = TreeNode(3)
>>> display_linked_list(root)
1 2 3
>>> root = None
>>> display_linked_list(root)

"""
current = root
while current:
if current.right is None:
print(current.data, end="")
break
print(current.data, end=" ")
current = current.right


if __name__ == "__main__":
print("Flattened Linked List:")
root = build_tree()
flatten(root)
display_linked_list(root)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Arunsiva003 patch 1 flatten tree by Arunsiva003 · Pull Request #9695 · TheAlgorithms/Python · GitHub
Skip to content
Merged
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
e3f51e6
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
64aa843
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
c59a81c
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
2ed09ab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
5cb6799
infix to prefix missing feature added (comments)
Arunsiva003 Oct 2, 2023
56f6ff8
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 2, 2023
a8a9a6f
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
c8d12c9
infix to prefix missing feature added (comments)
Arunsiva003 Oct 2, 2023
c2caec5
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
b51c2a2
newly updated infix_to_prefix
Arunsiva003 Oct 3, 2023
da601b7
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 3, 2023
2c4166f
newly updated infix_to_prefix_2
Arunsiva003 Oct 3, 2023
b0f71e9
newly updated infix_to_prefix_3
Arunsiva003 Oct 3, 2023
71f9365
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 4, 2023
1931aee
from the beginning
Arunsiva003 Oct 4, 2023
922af56
Created flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
4b7f3c2
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
c07f0ee
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
16e1edd
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
f55280a
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
599c2d9
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
c7a79b8
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
cdc2b4d
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
199e3fe
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
e7f0809
Update flatten_binarytree_to_linkedlist.py (space added)
Arunsiva003 Oct 4, 2023
ba58a13
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
79608ab
Update flatten_binarytree_to_linkedlist.py space added
Arunsiva003 Oct 4, 2023
b8f2bda
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
6cc0235
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
81797ab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
fd55b9e
flatten binary tree to linked list - 1
Arunsiva003 Oct 4, 2023
74320a1
Merge branch 'Arunsiva003-patch-1-flattenTree' of https://github.com/…
Arunsiva003 Oct 4, 2023
4132662
flatten binary tree to linked list final
Arunsiva003 Oct 4, 2023
924b5b6
flatten binary tree to linked list final
Arunsiva003 Oct 4, 2023
9504a42
review updated
Arunsiva003 Oct 4, 2023
b356328
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
a9a35b6
Update .pre-commit-config.yaml
cclauss Oct 4, 2023
7c1a2f6
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
5a78f7d
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 138 additions & 0 deletions data_structures/binary_tree/flatten_binarytree_to_linkedlist.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
"""
Comment thread
Arunsiva003 marked this conversation as resolved.
Binary Tree Flattening Algorithm

This code defines an algorithm to flatten a binary tree into a linked list
represented using the right pointers of the tree nodes. It uses in-place
flattening and demonstrates the flattening process along with a display
function to visualize the flattened linked list.
https://www.geeksforgeeks.org/flatten-a-binary-tree-into-linked-list

Author: Arunkumar A
Date: 04/09/2023
"""
from __future__ import annotations


class TreeNode:
"""
A TreeNode has data variable and pointers to TreeNode objects
for its left and right children.
"""

def __init__(self, data: int) -> None:
self.data = data
self.left: TreeNode | None = None
self.right: TreeNode | None = None


def build_tree() -> TreeNode:
"""
Build and return a sample binary tree.

Returns:
TreeNode: The root of the binary tree.

Examples:
>>> root = build_tree()
>>> root.data
1
>>> root.left.data
2
>>> root.right.data
5
>>> root.left.left.data
3
>>> root.left.right.data
4
>>> root.right.right.data
6
"""
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(5)
root.left.left = TreeNode(3)
root.left.right = TreeNode(4)
root.right.right = TreeNode(6)
return root


def flatten(root: TreeNode | None) -> None:
"""
Flatten a binary tree into a linked list in-place, where the linked list is
represented using the right pointers of the tree nodes.

Args:
root (TreeNode): The root of the binary tree to be flattened.

Examples:
>>> root = TreeNode(1)
>>> root.left = TreeNode(2)
>>> root.right = TreeNode(5)
>>> root.left.left = TreeNode(3)
>>> root.left.right = TreeNode(4)
>>> root.right.right = TreeNode(6)
>>> flatten(root)
>>> root.data
1
>>> root.right.right is None
False
>>> root.right.right = TreeNode(3)
>>> root.right.right.right is None
True
"""
if not root:
return

# Flatten the left subtree
flatten(root.left)

# Save the right subtree
right_subtree = root.right

# Make the left subtree the new right subtree
root.right = root.left
root.left = None

# Find the end of the new right subtree
current = root
while current.right:
current = current.right

# Append the original right subtree to the end
current.right = right_subtree

# Flatten the updated right subtree
flatten(right_subtree)


def display_linked_list(root: TreeNode | None) -> None:
"""
Display the flattened linked list.

Args:
root (TreeNode | None): The root of the flattened linked list.

Examples:
>>> root = TreeNode(1)
>>> root.right = TreeNode(2)
>>> root.right.right = TreeNode(3)
>>> display_linked_list(root)
1 2 3
>>> root = None
>>> display_linked_list(root)

"""
current = root
while current:
if current.right is None:
print(current.data, end="")
break
print(current.data, end=" ")
current = current.right


if __name__ == "__main__":
print("Flattened Linked List:")
root = build_tree()
flatten(root)
display_linked_list(root)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Arunsiva003 patch 1 flatten tree by Arunsiva003 · Pull Request #9695 · TheAlgorithms/Python · GitHub
Skip to content
Merged
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
e3f51e6
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
64aa843
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
c59a81c
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
2ed09ab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
5cb6799
infix to prefix missing feature added (comments)
Arunsiva003 Oct 2, 2023
56f6ff8
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 2, 2023
a8a9a6f
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
c8d12c9
infix to prefix missing feature added (comments)
Arunsiva003 Oct 2, 2023
c2caec5
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
b51c2a2
newly updated infix_to_prefix
Arunsiva003 Oct 3, 2023
da601b7
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 3, 2023
2c4166f
newly updated infix_to_prefix_2
Arunsiva003 Oct 3, 2023
b0f71e9
newly updated infix_to_prefix_3
Arunsiva003 Oct 3, 2023
71f9365
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 4, 2023
1931aee
from the beginning
Arunsiva003 Oct 4, 2023
922af56
Created flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
4b7f3c2
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
c07f0ee
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
16e1edd
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
f55280a
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
599c2d9
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
c7a79b8
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
cdc2b4d
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
199e3fe
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
e7f0809
Update flatten_binarytree_to_linkedlist.py (space added)
Arunsiva003 Oct 4, 2023
ba58a13
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
79608ab
Update flatten_binarytree_to_linkedlist.py space added
Arunsiva003 Oct 4, 2023
b8f2bda
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
6cc0235
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
81797ab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
fd55b9e
flatten binary tree to linked list - 1
Arunsiva003 Oct 4, 2023
74320a1
Merge branch 'Arunsiva003-patch-1-flattenTree' of https://github.com/…
Arunsiva003 Oct 4, 2023
4132662
flatten binary tree to linked list final
Arunsiva003 Oct 4, 2023
924b5b6
flatten binary tree to linked list final
Arunsiva003 Oct 4, 2023
9504a42
review updated
Arunsiva003 Oct 4, 2023
b356328
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
a9a35b6
Update .pre-commit-config.yaml
cclauss Oct 4, 2023
7c1a2f6
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
5a78f7d
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 138 additions & 0 deletions data_structures/binary_tree/flatten_binarytree_to_linkedlist.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
"""
Comment thread
Arunsiva003 marked this conversation as resolved.
Binary Tree Flattening Algorithm

This code defines an algorithm to flatten a binary tree into a linked list
represented using the right pointers of the tree nodes. It uses in-place
flattening and demonstrates the flattening process along with a display
function to visualize the flattened linked list.
https://www.geeksforgeeks.org/flatten-a-binary-tree-into-linked-list

Author: Arunkumar A
Date: 04/09/2023
"""
from __future__ import annotations


class TreeNode:
"""
A TreeNode has data variable and pointers to TreeNode objects
for its left and right children.
"""

def __init__(self, data: int) -> None:
self.data = data
self.left: TreeNode | None = None
self.right: TreeNode | None = None


def build_tree() -> TreeNode:
"""
Build and return a sample binary tree.

Returns:
TreeNode: The root of the binary tree.

Examples:
>>> root = build_tree()
>>> root.data
1
>>> root.left.data
2
>>> root.right.data
5
>>> root.left.left.data
3
>>> root.left.right.data
4
>>> root.right.right.data
6
"""
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(5)
root.left.left = TreeNode(3)
root.left.right = TreeNode(4)
root.right.right = TreeNode(6)
return root


def flatten(root: TreeNode | None) -> None:
"""
Flatten a binary tree into a linked list in-place, where the linked list is
represented using the right pointers of the tree nodes.

Args:
root (TreeNode): The root of the binary tree to be flattened.

Examples:
>>> root = TreeNode(1)
>>> root.left = TreeNode(2)
>>> root.right = TreeNode(5)
>>> root.left.left = TreeNode(3)
>>> root.left.right = TreeNode(4)
>>> root.right.right = TreeNode(6)
>>> flatten(root)
>>> root.data
1
>>> root.right.right is None
False
>>> root.right.right = TreeNode(3)
>>> root.right.right.right is None
True
"""
if not root:
return

# Flatten the left subtree
flatten(root.left)

# Save the right subtree
right_subtree = root.right

# Make the left subtree the new right subtree
root.right = root.left
root.left = None

# Find the end of the new right subtree
current = root
while current.right:
current = current.right

# Append the original right subtree to the end
current.right = right_subtree

# Flatten the updated right subtree
flatten(right_subtree)


def display_linked_list(root: TreeNode | None) -> None:
"""
Display the flattened linked list.

Args:
root (TreeNode | None): The root of the flattened linked list.

Examples:
>>> root = TreeNode(1)
>>> root.right = TreeNode(2)
>>> root.right.right = TreeNode(3)
>>> display_linked_list(root)
1 2 3
>>> root = None
>>> display_linked_list(root)

"""
current = root
while current:
if current.right is None:
print(current.data, end="")
break
print(current.data, end=" ")
current = current.right


if __name__ == "__main__":
print("Flattened Linked List:")
root = build_tree()
flatten(root)
display_linked_list(root)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Arunsiva003 patch 1 flatten tree by Arunsiva003 · Pull Request #9695 · TheAlgorithms/Python · GitHub
Skip to content
Merged
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
e3f51e6
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
64aa843
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
c59a81c
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
2ed09ab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
5cb6799
infix to prefix missing feature added (comments)
Arunsiva003 Oct 2, 2023
56f6ff8
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 2, 2023
a8a9a6f
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
c8d12c9
infix to prefix missing feature added (comments)
Arunsiva003 Oct 2, 2023
c2caec5
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
b51c2a2
newly updated infix_to_prefix
Arunsiva003 Oct 3, 2023
da601b7
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 3, 2023
2c4166f
newly updated infix_to_prefix_2
Arunsiva003 Oct 3, 2023
b0f71e9
newly updated infix_to_prefix_3
Arunsiva003 Oct 3, 2023
71f9365
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 4, 2023
1931aee
from the beginning
Arunsiva003 Oct 4, 2023
922af56
Created flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
4b7f3c2
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
c07f0ee
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
16e1edd
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
f55280a
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
599c2d9
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
c7a79b8
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
cdc2b4d
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
199e3fe
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
e7f0809
Update flatten_binarytree_to_linkedlist.py (space added)
Arunsiva003 Oct 4, 2023
ba58a13
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
79608ab
Update flatten_binarytree_to_linkedlist.py space added
Arunsiva003 Oct 4, 2023
b8f2bda
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
6cc0235
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
81797ab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
fd55b9e
flatten binary tree to linked list - 1
Arunsiva003 Oct 4, 2023
74320a1
Merge branch 'Arunsiva003-patch-1-flattenTree' of https://github.com/…
Arunsiva003 Oct 4, 2023
4132662
flatten binary tree to linked list final
Arunsiva003 Oct 4, 2023
924b5b6
flatten binary tree to linked list final
Arunsiva003 Oct 4, 2023
9504a42
review updated
Arunsiva003 Oct 4, 2023
b356328
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
a9a35b6
Update .pre-commit-config.yaml
cclauss Oct 4, 2023
7c1a2f6
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
5a78f7d
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 138 additions & 0 deletions data_structures/binary_tree/flatten_binarytree_to_linkedlist.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
"""
Comment thread
Arunsiva003 marked this conversation as resolved.
Binary Tree Flattening Algorithm

This code defines an algorithm to flatten a binary tree into a linked list
represented using the right pointers of the tree nodes. It uses in-place
flattening and demonstrates the flattening process along with a display
function to visualize the flattened linked list.
https://www.geeksforgeeks.org/flatten-a-binary-tree-into-linked-list

Author: Arunkumar A
Date: 04/09/2023
"""
from __future__ import annotations


class TreeNode:
"""
A TreeNode has data variable and pointers to TreeNode objects
for its left and right children.
"""

def __init__(self, data: int) -> None:
self.data = data
self.left: TreeNode | None = None
self.right: TreeNode | None = None


def build_tree() -> TreeNode:
"""
Build and return a sample binary tree.

Returns:
TreeNode: The root of the binary tree.

Examples:
>>> root = build_tree()
>>> root.data
1
>>> root.left.data
2
>>> root.right.data
5
>>> root.left.left.data
3
>>> root.left.right.data
4
>>> root.right.right.data
6
"""
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(5)
root.left.left = TreeNode(3)
root.left.right = TreeNode(4)
root.right.right = TreeNode(6)
return root


def flatten(root: TreeNode | None) -> None:
"""
Flatten a binary tree into a linked list in-place, where the linked list is
represented using the right pointers of the tree nodes.

Args:
root (TreeNode): The root of the binary tree to be flattened.

Examples:
>>> root = TreeNode(1)
>>> root.left = TreeNode(2)
>>> root.right = TreeNode(5)
>>> root.left.left = TreeNode(3)
>>> root.left.right = TreeNode(4)
>>> root.right.right = TreeNode(6)
>>> flatten(root)
>>> root.data
1
>>> root.right.right is None
False
>>> root.right.right = TreeNode(3)
>>> root.right.right.right is None
True
"""
if not root:
return

# Flatten the left subtree
flatten(root.left)

# Save the right subtree
right_subtree = root.right

# Make the left subtree the new right subtree
root.right = root.left
root.left = None

# Find the end of the new right subtree
current = root
while current.right:
current = current.right

# Append the original right subtree to the end
current.right = right_subtree

# Flatten the updated right subtree
flatten(right_subtree)


def display_linked_list(root: TreeNode | None) -> None:
"""
Display the flattened linked list.

Args:
root (TreeNode | None): The root of the flattened linked list.

Examples:
>>> root = TreeNode(1)
>>> root.right = TreeNode(2)
>>> root.right.right = TreeNode(3)
>>> display_linked_list(root)
1 2 3
>>> root = None
>>> display_linked_list(root)

"""
current = root
while current:
if current.right is None:
print(current.data, end="")
break
print(current.data, end=" ")
current = current.right


if __name__ == "__main__":
print("Flattened Linked List:")
root = build_tree()
flatten(root)
display_linked_list(root)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Arunsiva003 patch 1 flatten tree by Arunsiva003 · Pull Request #9695 · TheAlgorithms/Python · GitHub
Skip to content
Merged
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
e3f51e6
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
64aa843
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
c59a81c
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
2ed09ab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
5cb6799
infix to prefix missing feature added (comments)
Arunsiva003 Oct 2, 2023
56f6ff8
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 2, 2023
a8a9a6f
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
c8d12c9
infix to prefix missing feature added (comments)
Arunsiva003 Oct 2, 2023
c2caec5
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
b51c2a2
newly updated infix_to_prefix
Arunsiva003 Oct 3, 2023
da601b7
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 3, 2023
2c4166f
newly updated infix_to_prefix_2
Arunsiva003 Oct 3, 2023
b0f71e9
newly updated infix_to_prefix_3
Arunsiva003 Oct 3, 2023
71f9365
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 4, 2023
1931aee
from the beginning
Arunsiva003 Oct 4, 2023
922af56
Created flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
4b7f3c2
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
c07f0ee
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
16e1edd
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
f55280a
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
599c2d9
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
c7a79b8
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
cdc2b4d
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
199e3fe
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
e7f0809
Update flatten_binarytree_to_linkedlist.py (space added)
Arunsiva003 Oct 4, 2023
ba58a13
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
79608ab
Update flatten_binarytree_to_linkedlist.py space added
Arunsiva003 Oct 4, 2023
b8f2bda
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
6cc0235
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
81797ab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
fd55b9e
flatten binary tree to linked list - 1
Arunsiva003 Oct 4, 2023
74320a1
Merge branch 'Arunsiva003-patch-1-flattenTree' of https://github.com/…
Arunsiva003 Oct 4, 2023
4132662
flatten binary tree to linked list final
Arunsiva003 Oct 4, 2023
924b5b6
flatten binary tree to linked list final
Arunsiva003 Oct 4, 2023
9504a42
review updated
Arunsiva003 Oct 4, 2023
b356328
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
a9a35b6
Update .pre-commit-config.yaml
cclauss Oct 4, 2023
7c1a2f6
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
5a78f7d
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 138 additions & 0 deletions data_structures/binary_tree/flatten_binarytree_to_linkedlist.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
"""
Comment thread
Arunsiva003 marked this conversation as resolved.
Binary Tree Flattening Algorithm

This code defines an algorithm to flatten a binary tree into a linked list
represented using the right pointers of the tree nodes. It uses in-place
flattening and demonstrates the flattening process along with a display
function to visualize the flattened linked list.
https://www.geeksforgeeks.org/flatten-a-binary-tree-into-linked-list

Author: Arunkumar A
Date: 04/09/2023
"""
from __future__ import annotations


class TreeNode:
"""
A TreeNode has data variable and pointers to TreeNode objects
for its left and right children.
"""

def __init__(self, data: int) -> None:
self.data = data
self.left: TreeNode | None = None
self.right: TreeNode | None = None


def build_tree() -> TreeNode:
"""
Build and return a sample binary tree.

Returns:
TreeNode: The root of the binary tree.

Examples:
>>> root = build_tree()
>>> root.data
1
>>> root.left.data
2
>>> root.right.data
5
>>> root.left.left.data
3
>>> root.left.right.data
4
>>> root.right.right.data
6
"""
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(5)
root.left.left = TreeNode(3)
root.left.right = TreeNode(4)
root.right.right = TreeNode(6)
return root


def flatten(root: TreeNode | None) -> None:
"""
Flatten a binary tree into a linked list in-place, where the linked list is
represented using the right pointers of the tree nodes.

Args:
root (TreeNode): The root of the binary tree to be flattened.

Examples:
>>> root = TreeNode(1)
>>> root.left = TreeNode(2)
>>> root.right = TreeNode(5)
>>> root.left.left = TreeNode(3)
>>> root.left.right = TreeNode(4)
>>> root.right.right = TreeNode(6)
>>> flatten(root)
>>> root.data
1
>>> root.right.right is None
False
>>> root.right.right = TreeNode(3)
>>> root.right.right.right is None
True
"""
if not root:
return

# Flatten the left subtree
flatten(root.left)

# Save the right subtree
right_subtree = root.right

# Make the left subtree the new right subtree
root.right = root.left
root.left = None

# Find the end of the new right subtree
current = root
while current.right:
current = current.right

# Append the original right subtree to the end
current.right = right_subtree

# Flatten the updated right subtree
flatten(right_subtree)


def display_linked_list(root: TreeNode | None) -> None:
"""
Display the flattened linked list.

Args:
root (TreeNode | None): The root of the flattened linked list.

Examples:
>>> root = TreeNode(1)
>>> root.right = TreeNode(2)
>>> root.right.right = TreeNode(3)
>>> display_linked_list(root)
1 2 3
>>> root = None
>>> display_linked_list(root)

"""
current = root
while current:
if current.right is None:
print(current.data, end="")
break
print(current.data, end=" ")
current = current.right


if __name__ == "__main__":
print("Flattened Linked List:")
root = build_tree()
flatten(root)
display_linked_list(root)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Arunsiva003 patch 1 flatten tree by Arunsiva003 · Pull Request #9695 · TheAlgorithms/Python · GitHub
Skip to content
Merged
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
e3f51e6
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
64aa843
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
c59a81c
infix to prefix missing feature added
Arunsiva003 Oct 2, 2023
2ed09ab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
5cb6799
infix to prefix missing feature added (comments)
Arunsiva003 Oct 2, 2023
56f6ff8
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 2, 2023
a8a9a6f
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
c8d12c9
infix to prefix missing feature added (comments)
Arunsiva003 Oct 2, 2023
c2caec5
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 2, 2023
b51c2a2
newly updated infix_to_prefix
Arunsiva003 Oct 3, 2023
da601b7
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 3, 2023
2c4166f
newly updated infix_to_prefix_2
Arunsiva003 Oct 3, 2023
b0f71e9
newly updated infix_to_prefix_3
Arunsiva003 Oct 3, 2023
71f9365
Merge branch 'master' of https://github.com/Arunsiva003/Python
Arunsiva003 Oct 4, 2023
1931aee
from the beginning
Arunsiva003 Oct 4, 2023
922af56
Created flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
4b7f3c2
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
c07f0ee
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
16e1edd
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
f55280a
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
599c2d9
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
c7a79b8
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
cdc2b4d
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
199e3fe
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
e7f0809
Update flatten_binarytree_to_linkedlist.py (space added)
Arunsiva003 Oct 4, 2023
ba58a13
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
79608ab
Update flatten_binarytree_to_linkedlist.py space added
Arunsiva003 Oct 4, 2023
b8f2bda
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
6cc0235
Update flatten_binarytree_to_linkedlist.py
Arunsiva003 Oct 4, 2023
81797ab
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 4, 2023
fd55b9e
flatten binary tree to linked list - 1
Arunsiva003 Oct 4, 2023
74320a1
Merge branch 'Arunsiva003-patch-1-flattenTree' of https://github.com/…
Arunsiva003 Oct 4, 2023
4132662
flatten binary tree to linked list final
Arunsiva003 Oct 4, 2023
924b5b6
flatten binary tree to linked list final
Arunsiva003 Oct 4, 2023
9504a42
review updated
Arunsiva003 Oct 4, 2023
b356328
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
a9a35b6
Update .pre-commit-config.yaml
cclauss Oct 4, 2023
7c1a2f6
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
5a78f7d
Update flatten_binarytree_to_linkedlist.py
cclauss Oct 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 138 additions & 0 deletions data_structures/binary_tree/flatten_binarytree_to_linkedlist.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
"""
Comment thread
Arunsiva003 marked this conversation as resolved.
Binary Tree Flattening Algorithm

This code defines an algorithm to flatten a binary tree into a linked list
represented using the right pointers of the tree nodes. It uses in-place
flattening and demonstrates the flattening process along with a display
function to visualize the flattened linked list.
https://www.geeksforgeeks.org/flatten-a-binary-tree-into-linked-list

Author: Arunkumar A
Date: 04/09/2023
"""
from __future__ import annotations


class TreeNode:
"""
A TreeNode has data variable and pointers to TreeNode objects
for its left and right children.
"""

def __init__(self, data: int) -> None:
self.data = data
self.left: TreeNode | None = None
self.right: TreeNode | None = None


def build_tree() -> TreeNode:
"""
Build and return a sample binary tree.

Returns:
TreeNode: The root of the binary tree.

Examples:
>>> root = build_tree()
>>> root.data
1
>>> root.left.data
2
>>> root.right.data
5
>>> root.left.left.data
3
>>> root.left.right.data
4
>>> root.right.right.data
6
"""
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(5)
root.left.left = TreeNode(3)
root.left.right = TreeNode(4)
root.right.right = TreeNode(6)
return root


def flatten(root: TreeNode | None) -> None:
"""
Flatten a binary tree into a linked list in-place, where the linked list is
represented using the right pointers of the tree nodes.

Args:
root (TreeNode): The root of the binary tree to be flattened.

Examples:
>>> root = TreeNode(1)
>>> root.left = TreeNode(2)
>>> root.right = TreeNode(5)
>>> root.left.left = TreeNode(3)
>>> root.left.right = TreeNode(4)
>>> root.right.right = TreeNode(6)
>>> flatten(root)
>>> root.data
1
>>> root.right.right is None
False
>>> root.right.right = TreeNode(3)
>>> root.right.right.right is None
True
"""
if not root:
return

# Flatten the left subtree
flatten(root.left)

# Save the right subtree
right_subtree = root.right

# Make the left subtree the new right subtree
root.right = root.left
root.left = None

# Find the end of the new right subtree
current = root
while current.right:
current = current.right

# Append the original right subtree to the end
current.right = right_subtree

# Flatten the updated right subtree
flatten(right_subtree)


def display_linked_list(root: TreeNode | None) -> None:
"""
Display the flattened linked list.

Args:
root (TreeNode | None): The root of the flattened linked list.

Examples:
>>> root = TreeNode(1)
>>> root.right = TreeNode(2)
>>> root.right.right = TreeNode(3)
>>> display_linked_list(root)
1 2 3
>>> root = None
>>> display_linked_list(root)

"""
current = root
while current:
if current.right is None:
print(current.data, end="")
break
print(current.data, end=" ")
current = current.right


if __name__ == "__main__":
print("Flattened Linked List:")
root = build_tree()
flatten(root)
display_linked_list(root)