Skip to content

Commit 2edf31a

Browse files
authored
Added articles, Resolved Git-Issues (#5023)
* Added articles * Added articles * Added articles * fix golang-code lru-cache * fix java code
1 parent bd28845 commit 2edf31a

19 files changed

+2118
-43
lines changed

articles/binary-tree-from-preorder-and-inorder-traversal.md

Lines changed: 342 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -912,3 +912,345 @@ class Solution {
912912

913913
- Time complexity: $O(n)$
914914
- Space complexity: $O(n)$ for recursion stack.
915+
916+
---
917+
918+
## 4. Morris Traversal
919+
920+
::tabs-start
921+
922+
```python
923+
# Definition for a binary tree node.
924+
# class TreeNode:
925+
# def __init__(self, val=0, left=None, right=None):
926+
# self.val = val
927+
# self.left = left
928+
# self.right = right
929+
class Solution:
930+
def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
931+
head = TreeNode(None)
932+
curr = head
933+
i, j, n = 0, 0, len(preorder)
934+
while i < n and j < n:
935+
# Go right and then as far left as possible
936+
curr.right = TreeNode(preorder[i], right = curr.right)
937+
curr = curr.right
938+
i += 1
939+
while i < n and curr.val != inorder[j]:
940+
curr.left = TreeNode(preorder[i], right=curr)
941+
curr = curr.left
942+
i += 1
943+
j += 1
944+
while curr.right and j < n and curr.right.val == inorder[j]:
945+
prev = curr.right
946+
curr.right = None
947+
curr = prev
948+
j += 1
949+
950+
return head.right
951+
```
952+
953+
```java
954+
/**
955+
* Definition for a binary tree node.
956+
* public class TreeNode {
957+
* int val;
958+
* TreeNode left;
959+
* TreeNode right;
960+
* TreeNode() {}
961+
* TreeNode(int val) { this.val = val; }
962+
* TreeNode(int val, TreeNode left, TreeNode right) {
963+
* this.val = val;
964+
* this.left = left;
965+
* this.right = right;
966+
* }
967+
* }
968+
*/
969+
public class Solution {
970+
public TreeNode buildTree(int[] preorder, int[] inorder) {
971+
TreeNode head = new TreeNode(0);
972+
TreeNode curr = head;
973+
int i = 0, j = 0, n = preorder.length;
974+
975+
while (i < n && j < n) {
976+
curr.right = new TreeNode(preorder[i], null, curr.right);
977+
curr = curr.right;
978+
i++;
979+
while (i < n && curr.val != inorder[j]) {
980+
curr.left = new TreeNode(preorder[i], null, curr);
981+
curr = curr.left;
982+
i++;
983+
}
984+
j++;
985+
while (curr.right != null && j < n && curr.right.val == inorder[j]) {
986+
TreeNode prev = curr.right;
987+
curr.right = null;
988+
curr = prev;
989+
j++;
990+
}
991+
}
992+
return head.right;
993+
}
994+
}
995+
```
996+
997+
```cpp
998+
/**
999+
* Definition for a binary tree node.
1000+
* struct TreeNode {
1001+
* int val;
1002+
* TreeNode *left;
1003+
* TreeNode *right;
1004+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
1005+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
1006+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
1007+
* };
1008+
*/
1009+
class Solution {
1010+
public:
1011+
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
1012+
TreeNode* head = new TreeNode(0);
1013+
TreeNode* curr = head;
1014+
int i = 0, j = 0, n = preorder.size();
1015+
1016+
while (i < n && j < n) {
1017+
curr->right = new TreeNode(preorder[i], nullptr, curr->right);
1018+
curr = curr->right;
1019+
i++;
1020+
while (i < n && curr->val != inorder[j]) {
1021+
curr->left = new TreeNode(preorder[i], nullptr, curr);
1022+
curr = curr->left;
1023+
i++;
1024+
}
1025+
j++;
1026+
while (curr->right && j < n && curr->right->val == inorder[j]) {
1027+
TreeNode* prev = curr->right;
1028+
curr->right = nullptr;
1029+
curr = prev;
1030+
j++;
1031+
}
1032+
}
1033+
return head->right;
1034+
}
1035+
};
1036+
```
1037+
1038+
```javascript
1039+
/**
1040+
* Definition for a binary tree node.
1041+
* class TreeNode {
1042+
* constructor(val = 0, left = null, right = null) {
1043+
* this.val = val;
1044+
* this.left = left;
1045+
* this.right = right;
1046+
* }
1047+
* }
1048+
*/
1049+
1050+
class Solution {
1051+
/**
1052+
* @param {number[]} preorder
1053+
* @param {number[]} inorder
1054+
* @return {TreeNode}
1055+
*/
1056+
buildTree(preorder, inorder) {
1057+
let head = new TreeNode(null);
1058+
let curr = head;
1059+
let i = 0, j = 0, n = preorder.length;
1060+
1061+
while (i < n && j < n) {
1062+
curr.right = new TreeNode(preorder[i], null, curr.right);
1063+
curr = curr.right;
1064+
i++;
1065+
while (i < n && curr.val !== inorder[j]) {
1066+
curr.left = new TreeNode(preorder[i], null, curr);
1067+
curr = curr.left;
1068+
i++;
1069+
}
1070+
j++;
1071+
while (curr.right && j < n && curr.right.val === inorder[j]) {
1072+
let prev = curr.right;
1073+
curr.right = null;
1074+
curr = prev;
1075+
j++;
1076+
}
1077+
}
1078+
return head.right;
1079+
}
1080+
}
1081+
```
1082+
1083+
```csharp
1084+
/**
1085+
* Definition for a binary tree node.
1086+
* public class TreeNode {
1087+
* public int val;
1088+
* public TreeNode left;
1089+
* public TreeNode right;
1090+
* public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
1091+
* this.val = val;
1092+
* this.left = left;
1093+
* this.right = right;
1094+
* }
1095+
* }
1096+
*/
1097+
public class Solution {
1098+
public TreeNode BuildTree(int[] preorder, int[] inorder) {
1099+
TreeNode head = new TreeNode(0);
1100+
TreeNode curr = head;
1101+
int i = 0, j = 0, n = preorder.Length;
1102+
1103+
while (i < n && j < n) {
1104+
curr.right = new TreeNode(preorder[i], null, curr.right);
1105+
curr = curr.right;
1106+
i++;
1107+
while (i < n && curr.val != inorder[j]) {
1108+
curr.left = new TreeNode(preorder[i], null, curr);
1109+
curr = curr.left;
1110+
i++;
1111+
}
1112+
j++;
1113+
while (curr.right != null && j < n && curr.right.val == inorder[j]) {
1114+
TreeNode prev = curr.right;
1115+
curr.right = null;
1116+
curr = prev;
1117+
j++;
1118+
}
1119+
}
1120+
return head.right;
1121+
}
1122+
}
1123+
```
1124+
1125+
```go
1126+
/**
1127+
* Definition for a binary tree node.
1128+
* type TreeNode struct {
1129+
* Val int
1130+
* Left *TreeNode
1131+
* Right *TreeNode
1132+
* }
1133+
*/
1134+
func buildTree(preorder []int, inorder []int) *TreeNode {
1135+
head := &TreeNode{}
1136+
curr := head
1137+
i, j, n := 0, 0, len(preorder)
1138+
1139+
for i < n && j < n {
1140+
curr.Right = &TreeNode{Val: preorder[i], Right: curr.Right}
1141+
curr = curr.Right
1142+
i++
1143+
for i < n && curr.Val != inorder[j] {
1144+
curr.Left = &TreeNode{Val: preorder[i], Right: curr}
1145+
curr = curr.Left
1146+
i++
1147+
}
1148+
j++
1149+
for curr.Right != nil && j < n && curr.Right.Val == inorder[j] {
1150+
prev := curr.Right
1151+
curr.Right = nil
1152+
curr = prev
1153+
j++
1154+
}
1155+
}
1156+
return head.Right
1157+
}
1158+
```
1159+
1160+
```kotlin
1161+
/**
1162+
* Example:
1163+
* var ti = TreeNode(5)
1164+
* var v = ti.`val`
1165+
* Definition for a binary tree node.
1166+
* class TreeNode(var `val`: Int) {
1167+
* var left: TreeNode? = null
1168+
* var right: TreeNode? = null
1169+
* }
1170+
*/
1171+
class Solution {
1172+
fun buildTree(preorder: IntArray, inorder: IntArray): TreeNode? {
1173+
val head = TreeNode(0)
1174+
var curr: TreeNode? = head
1175+
var i = 0
1176+
var j = 0
1177+
val n = preorder.size
1178+
1179+
while (i < n && j < n) {
1180+
curr!!.right = TreeNode(preorder[i], null, curr.right)
1181+
curr = curr.right
1182+
i++
1183+
while (i < n && curr!!.`val` != inorder[j]) {
1184+
curr.left = TreeNode(preorder[i], null, curr)
1185+
curr = curr.left
1186+
i++
1187+
}
1188+
j++
1189+
while (curr!!.right != null && j < n && curr.right!!.`val` == inorder[j]) {
1190+
val prev = curr.right
1191+
curr.right = null
1192+
curr = prev
1193+
j++
1194+
}
1195+
}
1196+
return head.right
1197+
}
1198+
}
1199+
```
1200+
1201+
```swift
1202+
/**
1203+
* Definition for a binary tree node.
1204+
* public class TreeNode {
1205+
* public var val: Int
1206+
* public var left: TreeNode?
1207+
* public var right: TreeNode?
1208+
* public init() { self.val = 0; self.left = nil; self.right = nil; }
1209+
* public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
1210+
* public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
1211+
* self.val = val
1212+
* self.left = left
1213+
* self.right = right
1214+
* }
1215+
* }
1216+
*/
1217+
class Solution {
1218+
func buildTree(_ preorder: [Int], _ inorder: [Int]) -> TreeNode? {
1219+
let head = TreeNode(0)
1220+
var curr: TreeNode? = head
1221+
var i = 0, j = 0
1222+
let n = preorder.count
1223+
1224+
while i < n && j < n {
1225+
curr!.right = TreeNode(preorder[i], nil, curr!.right)
1226+
curr = curr!.right
1227+
i += 1
1228+
1229+
while i < n && curr!.val != inorder[j] {
1230+
curr!.left = TreeNode(preorder[i], nil, curr)
1231+
curr = curr!.left
1232+
i += 1
1233+
}
1234+
1235+
j += 1
1236+
while curr!.right != nil && j < n && curr!.right!.val == inorder[j] {
1237+
let prev = curr!.right
1238+
curr!.right = nil
1239+
curr = prev
1240+
j += 1
1241+
}
1242+
}
1243+
1244+
return head.right
1245+
}
1246+
}
1247+
```
1248+
1249+
::tabs-end
1250+
1251+
### Time & Space Complexity
1252+
1253+
* Time complexity: $O(n)$
1254+
* Space complexity:
1255+
* $O(1)$ extra space.
1256+
* $O(n)$ for the output tree.

0 commit comments

Comments
 (0)